Python: обертка рекурсивных функций

Как я могу обернуть рекурсивную функцию, включая рекурсивные вызовы? Например, для заданных 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__? Если это всегда так, о каких побочных эффектах мне следует помнить?

8
задан slezica 13 May 2012 в 18:42
поделиться