Как я могу упаковать несколько декораторов в одного?

У меня есть несколько декораторов на каждой функции, есть ли способ упаковать их в одному вместо этого?

@fun1
@fun2
@fun3
def do_stuf():
    pass

изменение в:

@all_funs #runs fun1 fun2 and fun3, how should all_funs look like?
def do_stuf():
    pass
10
задан Benjamin 1 February 2014 в 12:35
поделиться

3 ответа

Также можно написать общий декоратор, который поддерживает цепочке декоратора:

def fun1(f):
    print "fun1"
    return f

def fun2(f):
    print "fun2"
    return f

def fun3(f):
    print "fun3"
    return f

def chained(*dec_funs):
    def _inner_chain(f):
        for dec in reversed(dec_funs):
            f = dec(f)
        return f

   return _inner_chain

@fun1
@fun2
@fun3
def do_stuff():
    pass

@chained(fun1, fun2, fun3)
def do_stuff2():
    pass

all_funs = chained(fun1, fun2, fun3)

@all_funs
def do_stuff3():
    pass
7
ответ дан 3 December 2019 в 20:41
поделиться
def all_funs(f):
    return fun1(fun2(fun3(f)))
1
ответ дан 3 December 2019 в 20:41
поделиться

Учитывая имеющуюся у вас информацию, нет пути сделать то, что вы хотите. При работе с массивами, выделенными в куче, нужно где-то сохранить размер, если нужно снова с ним работать. Ни new , ни malloc не сделают этого для вас.

Теперь, если количество предметов в массиве сохранено где-либо, можно сделать это, чтобы получить общий размер в символах, который является единицей, с которой realloc работает. Код будет выглядеть следующим образом:

size_t array_memsize = elems_in_array * sizeof(BYTE);

Если вы действительно работаете с C++, а не C, я настоятельно рекомендую использовать для этого векторный шаблон вместо перехода к malloc и realloc . Векторный шаблон быстр и не так близко, как склонен к ошибкам, как управление собственной памятью. Кроме того, он отслеживает размер для вас.

-121--4144546-

Не пытайтесь обрабатывать html с помощью регулярных выражений ! Используйте PHP builtin parser вместо этого:

$dom = new DOMDocument;
$dom->loadHTML($string);
$bodies = $dom->getElementsByTagName('body');
assert($bodies->length === 1);
$body = $bodies->item(0);
for ($i = 0; $i < $body->children->length; $i++) {
    $body->remove($body->children->item($i));
}
$string = $dom->saveHTML();
-121--4561352-

декоратор в принципе является только синтаксическим сахаром для этого:

def do_stuf():
    pass

do_stuf = fun1(do_stuf)

Так что в вашем all_fun, все, что вам нужно сделать, это обернуть функцию в тот же тип цепочки декораторов:

def all_funs(funky):
    return fun1(fun2(fun3(fun4(funky)))

Вещи получить

10
ответ дан 3 December 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: