在对另一个问题的答案的评论中,有人说他们不确定functools.wraps在做什么.所以,我问这个问题,以便在StackOverflow上有一个记录,供将来参考:究竟functools.wraps做了什么?
def decorated(f):
@functools.wraps(f)
def wrapper():
return f()
return wrapper
@decorated
def g():
pass
Run Code Online (Sandbox Code Playgroud)
functools.wraps它的工作是保留以下名称g:
>>> g.__name__
'g'
Run Code Online (Sandbox Code Playgroud)
但是如果我传递一个参数g,我得到一个TypeError包含包装器的名称:
>>> g(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: wrapper() takes no arguments (1 given)
Run Code Online (Sandbox Code Playgroud)
这个名字来自哪里?它保存在哪里?有没有办法使异常看起来像g() takes no arguments?