2013-01-16 80 views
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(): 

我想打印出incude这个名字,因为我身边掠过更高层次的功能调试语句,很难说哪个功能调试语句引用。

我只知道one approach去的对象的名称,但它不能在这里工作很好(多个名称可参照的对象,但我想这事被装饰一个特定的名字) 。

+0

您可以使用'func .__ name__'或'func.func_name'我相信... – mgilson

+0

@mgilson:'__name__'是目前的首选拼写,因为它不仅仅是函数。 –

+0

@MartijnPieters - 我知道有人喜欢,但我不记得是哪一个。因此,这就是为什么我没有发布答案 - 希望我会记得这一次:) – mgilson

回答

3

功能的原始名称存储在.__name__属性:

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

您可以在datamodel documentation找到这样的信息感兴趣位,和很多的信息也总结了在文档中inspect module

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