2017-08-04 74 views
0

我想附加一個整型變量到任何存在的函數來記錄它被調用的次數。爲此,我寫下了以下裝飾器。修改Python中的freevars不起作用?

def count(fun): 
    n = 0 
    def wrapper(*args, **kwargs): 
    n += 1 
    print "%s called %d times" % (fun.func_name, n) 
    fun(*args, **kwargs) 
    return wrapper 

但它不起作用,因爲內部函數包裝中的n不被視爲外部作用域計數中的相同n。我想知道爲什麼會這樣?

我知道我可以繞過這個限制的一種方式是使用像列表這樣的可變容器來放入數字n。

回答

1

這個工作對我來說:

def count(fun): 
    def wrapper(*args, **kwargs): 
     wrapper.n += 1 
     print("%s called %d times" % (fun.__name__, wrapper.n)) 
     fun(*args, **kwargs) 
    wrapper.n = 0 
    return wrapper 

@count 
def test(): 
    print('hello') 

def main(): 
    for i in range(5): 
     test() 

if __name__ == '__main__': 
    main() 
1

在Python 3,你會使用nonlocal關鍵字(而不是global):

def count(fun): 
    n = 0 

    def wrapper(*args, **kwargs): 
     nonlocal n 

     n += 1 
     print("{} called {} times".format(fun.__name__, n)) 
     fun(*args, **kwargs) 

    return wrapper 

但是我從你的代碼,你猜尋找一個Python 2解決方案。

+0

是的,我正在使用Python2,我們的團隊明年將切換到Python3。 – PeopleMoutainPeopleSea