对exec行为的任何解释?

She*_*har 3 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)
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

Sve*_*ach 7

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

另请注意,您的exec陈述可能应该阅读

exec s in {}, d
Run Code Online (Sandbox Code Playgroud)

这将把它们变成合格的 exec语句,使代码有效.

请注意,您的代码可以在Python 3.x中使用. exec()已经变成了一个函数,并且不能再修改封闭函数的局部变量,从而对上面的使用做了exec不必要的限制.