为什么此闭包两次运行其print语句?

时间:2018-11-28 17:06:38

标签: python-3.x

我之前用学习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调用都不会重置附加到闭包函数的状态信息?

0 个答案:

没有答案