python 中的 __name__ 有什么重要的?

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 表达式(它们是无名的)作为模型字段的默认值。

有人可以添加一些更有问题的例子吗?同样的问题适用于类装饰器。