15

这按预期工作

def outer_func():
    from time import *

    print time()

outer_func()

我可以在上下文中定义嵌套函数并从其他嵌套函数中调用它们:

def outer_func():
    def time():
        return '123456'

    def inner_func():
        print time()

    inner_func()

outer_func()

我什至可以导入单个函数:

def outer_func():
    from time import time

    def inner_func():
        print time()

    inner_func()

outer_func()

然而,这会抛出SyntaxError: import * is not allowed in function 'outer_func' because it contains a nested function with free variables

def outer_func():
    from time import *

    def inner_func():
        print time()

    inner_func()

outer_func()

我知道这不是最佳实践,但为什么它不起作用?

4

1 回答 1

22

编译器无法知道时间模块是否导出名为time.

嵌套函数的自由变量在编译时与闭包单元相关联。闭包单元本身指向编译代码中定义的(局部)变量,而不是全局变量,它们根本没有绑定。查看python数据模型;函数通过属性引用它们的全局变量func_globals,并且该func_closure属性包含一系列闭包单元(或None)。

因此,您不能在嵌套范围内使用动态导入语句。

为什么嵌套函数需要闭包?因为您需要一种机制来在函数本身完成时引用局部函数变量:

def foo(spam):
    def bar():
        return spam
    return bar

afunc = foo('eggs')

通过调用foo(),我获得了一个引用范围变量的嵌套函数,编译器需要为解释器创建必要的引用,以便能够再次检索该范围变量。因此,细胞,以及对它们的限制。

于 2012-11-19T15:11:53.627 回答