在高阶函数中关闭魔法。

时间:2018-05-27 22:53:29

标签: python python-3.x closures higher-order-functions

很容易知道如何将一个全局变量赋值给一个内部函数 - 这会使全局变量本身就是一个与内部函数相等的函数 - 但是解释器如何知道如何调用一个内部函数使用下面的代码?

def outer(arg):
    def inner(arg2):
        print(arg, ',', arg2):
    return inner

a = outer(‘outer arg’)

print(a) # .inner at 0x109bd0048
a('inner arg') # Output: outer arg, inner arg

执行print(a),我们看到变量/ function a成为内部函数。

我不明白的是,如何将a变量分配给外部函数,如何使用代码a(‘inner argument’))

来定位内部函数和参数

是否以某种方式隐式调用内部函数而没有明确说明它?

它是否正在做这样的事情:

a = outer('outer arg')inner('inner arg')

这个魔术背后的python源代码在哪里?

1 个答案:

答案 0 :(得分:0)

我没有足够的评论声誉,所以我必须写一个答案......

Luciano Ramalho出色的“Fluent Python”:

  

“... Python保留了本地和自由变量的名称   __code__属性表示编译的主体   函数“

     

“总结一下:闭包是一个保留绑定的函数   定义函数时存在的自由变量,以便   它们可以在以后调用函数和定义时使用   范围不再可用“

我在您的代码中添加了几行以显示它:

def outer(arg):
    def inner(arg2):
        print(arg, ',', arg2)
    print (inner.__code__.co_freevars)
    print (inner.__closure__[0].cell_contents)
    return inner

打印以下内容:

In [169]: outer('outer arg')
('arg',)
outer arg

因为你可以看到arg的值即使在函数超出范围之后也会被保留,因为它是一个自由变量。 arg的绑定保存在__closure__属性中。

这只是进一步阅读的暗示,我绝不是专家。