__name__属性被分配给每个 python 函数。 例如

>>> def f(*args, **kwargs):
...     pass
... 
>>> f.__name__
'f'

现在,如果我们用一些装饰器装饰这个函数,我们本质上就是返回另一个具有不同__name__函数

>>> def d(f):
...     def w(*args, **kwargs):
...         f(*args, **kwargs)
...     return w
... 
>>> f = d(f)
>>> f.__name__
'w'

强烈建议使用functools wraps来修饰返回的函数,这样__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' 

我的问题是,如果我们不使用wraps来复制信息,我们会遇到哪些严重的麻烦? __name__有什么重要的地方应该被复制? 简单的代码,就像我的例子,如果我们不使用wrap就可以正常工作。

我认为一个问题是序列化。 例如,Django 不允许使用 lambda 表达式(它们是无名的)作为模型字段的默认值。

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

  ask by Nafees Anwar translate from so

本文未有回复,本站智能推荐:

3回复

Ruby中的函数装饰器,如Python

有没有办法在Ruby中装饰一个函数,就像在Python中完成一样? 也就是说,在每个函数的开头(和结束?)执行某些操作。 像这样: http : //programmingbits.pythonblogs.com/27_programmingbits/archive/50_functio
1回复

找出功能对象中的字典中的哪些键可访问python

抱歉,标题不太清楚。 本质上,我需要执行以下操作。 我在Python中有一个函数,例如: 然后,我有一个装饰器对象,该对象将函数作为输入,例如 我需要一种方法来确定装饰器的init方法中该函数使用的词典的键是什么。 有没有办法做到这一点? 我一直在研究函数自省
2回复

在 Python 中获取相反的函数

假设函数: 是否有一种 Pythonic 方式来获取否则将被定义为的函数: 使用如下语法:
1回复

在Python中查找函数的参数

我想能够问一个类的__init__方法它的参数是什么。 直截了当的方法如下: 但是,如果类有任何装饰器,那将无效。 它将给出装饰器返回的函数的参数列表。 我想了解原始的__init__方法并获取原始参数。 在装饰器的情况下,装饰器函数将在装饰器返回的函数的闭包中找到: 但
1回复

为什么这个python装饰器不打印原始函数中的值?

我正在尝试使用Python学习装饰器,每当我认为得到它时,都会遇到这样的问题。 我不知道为什么无法显示my_func的打印语句,而是返回“无”。 如果在包装return (func, wrapper) return语句中包含func ,则会出现错误,指出元组对象不可调用。 这个例子有什么问
1回复

了解类装饰器在Python中的工作方式

我在理解Python中的类装饰器如何工作时遇到了问题。 在这种情况下,我想编写一个装饰器,该装饰器计算调用递归函数(搜索最大公因数)的次数。 我有一个装饰器: 和一个功能: 然后我称他们为: NWD功能到底发生了什么? 据我所知,装饰器接受一个函数并创建另一个函数,
2回复

装饰器中的这个函数在 Python 中是如何工作的?

在def wrapper()我们有print_name_function() ,它是如何工作的,为什么我们在这里包含() ? 我看到我们正在将print_name_function传入title_decorator 但我真的不明白它是如何包含在def wrapper()以及在print_na
1回复

Python装饰器在不同的类中调用函数

我正在尝试编写一个装饰器,该装饰器除了要按特定顺序装饰的功能以外,还调用两个附加功能并运行它们。 我已经尝试了以下方法: 最终目标是让装饰器使用以下流程设置>测试>拆卸进行测试。 我知道我没有正确调用设置和拆卸。 我将不胜感激,该如何使用Python,并且我对涉及参
1回复

python中的函数装饰器会隐式调用装饰后的函数吗?

我的头衔可能会引起误解。 我的问题来自此代码段。 当我执行上面的代码时,我得到的输出为 但是,我认为输出应仅为 只是装饰函数,调用构造函数并执行myDecorator对象。我的印象是,只有当aFunction()时,装饰器模式才会执行。 为什么会这样呢? 关于装
1回复

在 Python 中创建一个装饰器,它会记住函数的最后输出

我需要创建一个装饰器,它记住它装饰的函数的最后一次调用结果。 例如,我有一个函数: 我需要使用装饰器(没有任何类或 smth),使它像这样: 我是装饰师的新手,现在我不知道如何做到这一点。 仅当我尝试在一次运行中两次调用该函数时,才会得到所需的结果。