修改Python中的freevars不起作用?

时间:2017-08-04 05:36:20

标签: python closures

我正在尝试将一个整数变量附加到任何存在的函数来记录它被调用的次数。为此,我写下了以下的装饰者。

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。

2 个答案:

答案 0 :(得分: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 :(得分: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解决方案。