2016-08-18 64 views
2

守則

def blahblah(func): 
    def wrapper(*args): 
     pass # blah blah blah.... 
    return wrapper 

@blahblah 
def func1(arg1): 
    pass # blah blah blah 

@blahblah 
def func2(arg1): 
    pass # blah blah blah 

functions = [func1, func2] 

for func in functions: 
    print(func.__name__, func(0)) 

我想要的是得到這個代碼的原始名稱,如「FUNC1」和「FUNC2」。但之前編寫的代碼只是給了我「包裝器」和「包裝器」。有什麼辦法嗎?最好不要改變包裝代碼。如何在函數裝飾器包裝函數後獲取函數的原始名稱?

輸出

wrapper None 
    wrapper None 

理想輸出

func1 None 
    func2 None 
+1

[這是一個很棒的博客文章](https://hynek.me/articles/decorators/)的主題。 – kojiro

回答

5

可以使用functools.wraps輔助函數如下which'll保留原來的名稱和包裝的函數的文檔字符串,如:

from functools import wraps 

def blahblah(func): 
    @wraps(func) 
    def wrapper(*args): 
     pass # blah blah blah.... 
    return wrapper 

@blahblah 
def func1(arg1): 
    pass # blah blah blah 

print(func1.__name__) 
# func1 

由於kojiro在評論中指出,而th是保留的名稱和文檔字符串,有東西要注意 - https://hynek.me/articles/decorators/