分类目录:《系统学习Python》总目录
我们在某些情况下可能想要共享全局状态。如果我们真的想要每个函数都有自己的计数器,要么像前面的文章那样使用类,要么使用Python3.X中的闭包函数(工厂函数)和nonlocal
语句。由于这条新语句允许修改外层函数作用域变量,因此这些变量可以充当每次装饰各自拥有的可修改数据。下面的代码仅在Python3.X中运行:
def tracer(func):
calls = 0
def wrapper(*args, **kwargs):
nonlocal calls
calls += 1
print('call %s to %s' % (calls, func.__name__))
return func(*args, **kwargs)
return wrapper
@tracer
def spam(a, b, c):
print(a + b + c)
@tracer
def eggs(s, y):
print(x ** y)
span(1, 2, 3)
span(a=4, b=5, c=6)
eggs(2, 16)
eggs(4, y=4)
现在,由于外层作用域变量不能跨程序而成为全局的,因此每个被包装函数再次有了自己的计数器,就像是用类和属性实现的一样。这里是在3.X下运行后新的输出:
参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.