引用装饰器内装饰函数的名称

时间:2013-01-16 21:24:25

标签: python python-3.x

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

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():

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

我只知道one approach获取对象的名称,但它在这里不能很好地工作(多个名称可以引用一个对象,但是我想要一个特定的名称发生在装饰)。

1 个答案:

答案 0 :(得分:3)

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

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

您可以在datamodel documentation中找到类似这样的有趣信息,而且inspect module的文档中也总结了很多信息。

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