Как я могу обернуть рекурсивную функцию, включая рекурсивные вызовы? Например, для заданных foo
и wrap
:
def foo(x):
return foo(x - 1) if x > 0 else 1
def wrap(f):
def wrapped(*args, **kwargs):
print "f was called"
return f(*args, **kwargs)
return wrapped
wrap(foo)(x)
выведет только "f был вызван"
с первым вызов. Рекурсивные вызовы по-прежнему адресуют foo()
.
Я не возражаю против того, чтобы чинить патчи или ковыряться во внутренностях. Я не планирую добавлять этот код в следующую программу обращения с ядерными боеголовками, поэтому, даже если это плохая идея, я бы хотел добиться эффекта.
Изменить: например, будет ли работать исправление foo.func_globals
для переопределения foo.__name__
? Если это всегда так, о каких побочных эффектах мне следует помнить?