Это заканчивается бесконечной рекурсией, например, когда вызывается lambda e: log_event(handler.handle, e)
, handler.handle
уже является выражением лямбда . log_event
будет вызывать лямбда , а лямбда будет вызывать log_event
и т. Д.
Чтобы исправить это, просто сохраните текущий метод в локальной области, для этого также не требуется дополнительное лямбда-выражение.
class EventHandler:
def handle(self, event):
pass
def wrap_handler(handler):
proc = handler.handle
def log_event(e):
print e
proc(e)
handler.handle = log_event
handler = EventHandler()
wrap_handler(handler)
handler.handle('event')
Вы также можете использовать декоратор.
def logging(function):
def wrapper(*args, **kwargs):
print "Calling %s with:" % function.__name__, args, kwargs
return function(*args, **kwargs)
return wrapper
class EventHandler:
@ logging
def handle(self, event):
pass
def __repr__(self):
return "EventHandler instance"
handler = EventHandler()
handler.handle('event')
C: \ Users \ Никлас \ Desktop> foo.py
Дескриптор вызова с: (экземпляр EventHandler, 'событие') {}