系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和非局部变量]
2024-01-01 13:01:23
分类目录:《系统学习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.
文章来源:https://blog.csdn.net/hy592070616/article/details/135320860
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!