Ответ 1
Декораторы обычно возвращают функцию-обертку; просто поместите свою логику в функцию-оболочку после вызова функции-оболочки.
def audit_action(action):
def decorator_func(func):
def wrapper_func(*args, **kwargs):
# Invoke the wrapped function first
retval = func(*args, **kwargs)
# Now do something here with retval and/or action
print('In wrapper_func, handling action {!r} after wrapped function returned {!r}'.format(action, retval))
return retval
return wrapper_func
return decorator_func
Таким образом, audit_action(action='did something')
является фабрикой декораторов, которая возвращает ограниченную область decorator_func
, которая используется для украшения вашего do_something
(do_something = decorator_func(do_something)
).
После оформления ваша ссылка на do_something
была заменена на wrapper_func
. Вызов wrapper_func()
вызывает исходную wrapper_func()
do_something()
, и тогда ваш код в функции оболочки может что-то делать.
Приведенный выше код в сочетании с вашей примерной функцией дает следующий вывод:
>>> do_something('foo')
In wrapper_func, handling action 'did something' after wrapped function returned 'bar'
'bar'