我之前用学习Python的相同代码块发布了一个问题;我希望可以。无论如何,这是我尝试理解的代码:
def makeopen(id):
original = builtins.open
def custom(*pargs, **kargs):
print('Custom open call %r' %id, pargs, kargs)
return original(*pargs,*kargs)
builtins.open(custom)
这本书通过示例,
>>>makeopen('spam')
>>>F = open('scripty2.py')
Custom open call 'spam': ('script2.py',) {}
这很好,在大多数情况下我都理解这一点。我无法理解的是第二次调用makeopen时:
>>>makeopen('eggs')
>>>F = open('script2.py')
Custom open call 'eggs': ('script2.py',) {}
Custom open call 'spam': ('script2.py',) {}
这本书说:“由于每个定制都在其自身的作用域内记住了以前的内置作用域版本,因此它们甚至可以自然地嵌套……”和“对makeopen闭合函数的每次调用都记住了自己的id和原始,因此可以运行多个自定义”
我不明白“自然嵌套”的含义。通过查看代码,我觉得输出应该是单个打印行,
Custom open call 'eggs': ('script2.py',) {}
第二次调用嵌套自定义函数。由于使用'eggs'调用makeopen会设置id =='eggs',因此闭包如何“记住”先前调用makeopen的其他状态信息?为什么每次makeopen调用都不会重置附加到闭包函数的状态信息?