Wraps 在装饰器中使用时会产生 TypeError
Posted
技术标签:
【中文标题】Wraps 在装饰器中使用时会产生 TypeError【英文标题】:Wraps gives TypeError when used in a decorator 【发布时间】:2017-11-02 05:15:37 【问题描述】:我创建了一个装饰器来打印它所装饰的函数的名称并且它可以工作:
>>> def debug(func):
... msg=func.__qualname__
... def wrapper(*args, **kwargs):
... print(msg)
... return func(*args, **kwargs)
... return wrapper
...
>>> @debug
... def add(x, y):
... return x+y
...
>>> add(1,2)
add
3
现在我想将 wraps 装饰器应用于包装器,但是当我这样做时,我收到错误“TypeError: update_wrapper() got multiple values for argument 'wrapped'”
>>> from functools import wraps
>>>
>>> def debug(func):
... msg=func.__qualname__
... @wraps
... def wrapper(*args, **kwargs):
... print(msg)
... return func(*args, **kwargs)
... return wrapper
...
>>> @debug
... def add(x, y):
... return x+y
...
>>> add(1,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: update_wrapper() got multiple values for argument 'wrapped'
>>>
我做错了什么以及为什么会发生错误?
【问题讨论】:
【参考方案1】:知道了。抱歉,问题是我错误地使用了包装作为装饰器。这是正确的代码
def debug(func):
msg = func.__qualname__
@wraps(func)
def wrapper(*args, **kwargs):
print(msg)
return func(*args, **kwargs)
return wrapper
【讨论】:
以上是关于Wraps 在装饰器中使用时会产生 TypeError的主要内容,如果未能解决你的问题,请参考以下文章