Naf*_*war 6 python function decorator
__name__每个python函数都分配了一个属性。例如
>>> def f(*args, **kwargs):
... pass
...
>>> f.__name__
'f'
Run Code Online (Sandbox Code Playgroud)
现在,如果我们用一些装饰器来装饰这个函数,我们本质上就是返回另一个不同的函数 __name__
>>> def d(f):
... def w(*args, **kwargs):
... f(*args, **kwargs)
... return w
...
>>> f = d(f)
>>> f.__name__
'w'
Run Code Online (Sandbox Code Playgroud)
强烈推荐使用wrapsfromfunctools来修饰返回的函数,这样可以将__name__和 之类的信息__doc__复制到原始函数中。
>>> from functools import wraps
>>> def d(f):
... @wraps(f)
... def w(*args, **kwargs):
... f(*args, **kwargs)
... return w
...
>>> f = d(f)
>>> f.__name__
'f'
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我们不使用wraps复制信息,我们会遇到哪些严重的问题?简单地说__name__,它有什么重要的地方应该被复制?简单的代码,就像我的例子一样,如果我们不使用wrap.
我认为一个问题是序列化。例如,Django 不允许使用 lambda 表达式(它们是无名的)作为模型字段的默认值。
有人可以添加一些更有问题的例子吗?同样的问题适用于类装饰器。