我可以在装饰器内部引用要装饰的对象的名称吗?如,
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获取对象的名称,但它在这里不能很好地工作(多个名称可以引用一个对象,但是我想要一个特定的名称发生在装饰)。
答案 0 :(得分:3)
函数的原始名称存储在.__name__
属性中:
>>> def foo(): pass
...
>>> foo.__name__
'foo'
>>> bar = foo
>>> bar.__name__
'foo'
您可以在datamodel documentation中找到类似这样的有趣信息,而且inspect
module的文档中也总结了很多信息。
您可能还想查看functools.wraps
decorator,它使用原始包装函数的属性更新包装函数(通常在装饰器中使用),包括它的名称和文档字符串。