У меня есть несколько декораторов на каждой функции, есть ли способ упаковать их в одному вместо этого?
@fun1
@fun2
@fun3
def do_stuf():
pass
изменение в:
@all_funs #runs fun1 fun2 and fun3, how should all_funs look like?
def do_stuf():
pass
Также можно написать общий декоратор, который поддерживает цепочке декоратора:
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
Учитывая имеющуюся у вас информацию, нет пути сделать то, что вы хотите. При работе с массивами, выделенными в куче, нужно где-то сохранить размер, если нужно снова с ним работать. Ни new
, ни malloc
не сделают этого для вас.
Теперь, если количество предметов в массиве сохранено где-либо, можно сделать это, чтобы получить общий размер в символах, который является единицей, с которой realloc
работает. Код будет выглядеть следующим образом:
size_t array_memsize = elems_in_array * sizeof(BYTE);
Если вы действительно работаете с C++, а не C, я настоятельно рекомендую использовать для этого векторный шаблон вместо перехода к malloc
и realloc
. Векторный шаблон быстр и не так близко, как склонен к ошибкам, как управление собственной памятью. Кроме того, он отслеживает размер для вас.
Не пытайтесь обрабатывать 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)))
Вещи получить