对exec行为的解释?

3 投票
2 回答
3282 浏览
提问于 2025-04-17 12:35

想找个简单明了的解释,为什么这段代码会出现 SyntaxError 错误。

def echo(x):
    return x

def foo(s):
    d = {}
    exec(s, {}, d)
    return dict((x,y) for x,y in d.items())

def bar(s):
    d = {}
    exec(s, {}, d)
    return dict((x, echo(y)) for x,y in d.items()) # comment this to compile

s = 'a=1'
foo(s)

  File "test.py", line 11
    exec(s, {}, d)
SyntaxError: unqualified exec is not allowed in function 'bar' it contains a
             nested function with free variables

2 个回答

3

你可能是在用 Python 3.x 的手册来写 Python 2.x 的代码。使用 Python 3.2 的时候我没有遇到这个错误,而在 Python 2.7 中,exec 的写法是完全不同的。

7

在Python 2.x中,exec语句不能出现在有局部“函数”的函数里,这些局部“函数”有自由变量。生成器表达式会隐式地定义某种“函数”(更准确地说,是一个代码对象),这个代码会在每次迭代时执行。在foo()中,这段代码只包含对xy的引用,它们是生成器表达式内部的局部变量。而在bar()中,代码还引用了自由变量echo,这就使得bar()不能使用exec

另外,你的exec语句可能应该写成

exec s in {}, d

这样会把它们变成合格的exec语句,使得代码有效。

需要注意的是,在Python 3.x中,你的代码是可以正常工作的。exec()已经变成了一个函数,不能再修改外部函数的局部变量,因此上面提到的关于exec使用的限制就不再必要了。

撰写回答