函数闭包
一般函数执行结束时该函数的局部变量会消失,假如,我们希望先保留函数中的临时局部变量,这时候就可以用上闭包了,
闭包其实就是能够读取其他函数内部变量的函数,闭包实际就是python装饰器的原理
我们在开发中能尽量避免使用全局变量的就尽量避免使用。因为不同模块,不同函数都可以自由的访问全局变量,可能会造成全局变量的不可预知性。
闭包避免了使用全局变量,此外,闭包允许将函数与其所操作的某些数据(环境)关连起来。而且使用闭包,可以使代码变得更加的优雅
形成闭包的条件:
1.在一个外函数中定义了一个内函数
2.在内函数引用了外函数的临时变量
3.外函数的返回值是内函数的引用
如何验证函数是否是闭包?
可以通过__closure__属性,如果函数是闭包的话,会返回一个由于cell组成的元组对象,cell对象的 cell_contents 属性就是存储在闭包中的变量
def use_logging(func):
def inner(*args, **kwargs):
logging.info("{} is running".format(func.__name__))
return func(*args, **kwargs)
return inner
f = use_logging(func)
print(f.__closure__)
print(f.__closure__[0].cell_contents)
-----------
#(<cell at 0x0000015984AE1438: function object at 0x0000015984ADBAF8>,)
#<function func at 0x0000015984ADBAF8>