Python 中函数的 __closure__ 属性
Python 函数的 __closure__ 属性是什么?如何通过它查看闭包捕获的自由变量?
回答
我是大山
__closure__ 保存闭包捕获的自由变量(cell 对象元组),__code__.co_freevars 保存变量名。
def make_adder(n):
def adder(x):
return x + n
return adder
add5 = make_adder(5)
print(add5.__closure__) # (<cell at 0x...: int object at 0x...>,)
print(add5.__closure__[0].cell_contents) # 5
print(add5.__code__.co_freevars) # ('n',)
# 多个自由变量
def make_multiplier():
a, b = 10, 20
def mul(x):
return x * a + b
return mul
m = make_multiplier()
print(m.__code__.co_freevars) # ('a', 'b')
for cell in m.__closure__:
print(cell.cell_contents) # 10, 20
注意:没有捕获自由变量的嵌套函数(纯内部函数)没有 __closure__。