您有两个包装函数,而您只需要一个。请注意,每个包装器函数都带有一个参数。这应该是正在发生的事情的线索。
你有:
def decorator(take_a_function): def wrapper1(take_a_function): def wrapper2(*takes_multiple_arguments):# do stuffreturn take_a_function(*takes_multiple_arguments) return wrapper2 return wrapper1
当用它装饰一个函数时:
@decoratordef my_function(*takes_multiple_arguments): pass
这等效于:
def my_function(*takes_multiple_arguments): passmy_function = decorator(my_function)
但要进行
decorator(my_function)返回
wrapper1,如果您还记得,则返回一个参数
take_a_function。这显然不是您想要的。你想
wrapper2回来。如您的答案所示,解决方案是删除外部wrapper(
wrapper1):
from functools import wrapsdef decorator(takes_a_function): @wraps(takes_a_function) def wrapper(*args, **kwargs): # logic here return takes_a_function(*args, **kwargs) return wrapper



