对exec行为的任何解释?

时间:2012-02-08 14:33:18

标签: python

寻找有关此代码引发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 个答案:

答案 0 :(得分:7)

在Python 2.x中,exec语句可能不会出现在具有自由变量的本地“函数”的函数中。生成器表达式隐式地为应该在每次迭代中执行的代码定义某种“函数”(或更确切地说,代码对象)。在foo()中,此代码仅包含对xy的引用,这些引用是生成器表达式中的本地名称。在bar()中,代码还包含对自由变量echo的引用,该引用取消bar()使用exec的资格。

另请注意,您的exec语句可能应该阅读

exec s in {}, d

将它们转换为限定的 exec语句,使代码有效。

请注意,您的代码可以在Python 3.x中使用。 exec()已经变成了一个函数,不能再修改封闭函数的局部变量,因此不必对exec的使用进行上述限制。

答案 1 :(得分:3)

您可能尝试使用python 3.x手册编写python 2.x代码。使用Python 3.2我没有收到此错误,在Python 2.7中,exec语法为quite different