2017-08-04 63 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