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的主要内容,如果未能解决你的问题,请参考以下文章

装饰器中的@functools.wraps的作用

python装饰器中的@wraps

python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变

自己编写一个装饰器中的装饰器函数

python3 装饰器修复技术@wraps到底是什么?

学习笔记2-functools.wraps 装饰器