0

我可以在装饰器内部引用被装饰对象的名称吗?例如,

def add_debug_info(func):
    # how to write magic_function?
    name = magic_function(func)
    # name is 'execute' when applied as
    # @add_debug_info
    # def execute():

我正在尝试打印包含此名称的调试语句,因为我正在传递更高级别的函数,并且很难判断调试语句所指的是哪个函数。

我只知道一种获取对象名称的方法,但在这里效果不佳(多个名称可以引用一个对象,但我想要一个恰好被修饰的特定名称)。

4

1 回答 1

3

函数的原始名称存储在.__name__属性中:

>>> def foo(): pass
...
>>> foo.__name__
'foo'
>>> bar = foo
>>> bar.__name__
'foo'

您可以在数据模型文档中找到类似这样的有趣信息,并且该inspect模块的文档中也总结了许多此类信息。

您可能还想看看functools.wrapsdecorator,它使用原始包装函数的属性更新包装函数(通常在装饰器中使用),包括它的名称和它的文档字符串。

于 2013-01-16T21:26:28.173 回答