2013-01-16 123 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,該函數使用原始包裝函數的屬性(包括名稱和文檔字符串)更新包裝函數(通常用於裝飾器中)。