繁体   English   中英

我正在尝试了解Python的exec()函数

[英]I'm trying to understand Python's exec() function

所以我有一个像这样的函数的字符串

code = """def somefn(x):
    return x + x
    y = somefn(z)"""

我试图在另一个函数中运行它

def otherfn(codestr):
    z = 2
    exec(codestr)
    return y

otherfn(code)

但这给了我错误:

追溯(最近一次通话最近):文件“ C:/Users/Admin/Desktop/heh.py”,第11行,在其他fn(代码)文件“ C:/Users/Admin/Desktop/heh.py”,第9行,在otherfn中返回y NameError:未定义名称'y'

它在功能之外工作正常

z=2 exec(codestr) print(y)

它发现y很好,但不确定为什么在函数中时会出现bug。

我怎样才能解决这个问题? 与globals()和locals()有关吗? 使用Python 3.6 btw。

您的代码有几个问题。 首先,您有一个缩进问题yreturn后在somefn()函数内被“定义”,因此它实际上从未有机会进入堆栈。 您需要将code重新定义为:

code = """def somefn(x):
    return x + x
y = somefn(z)"""

但这只是冰山一角。 更大的问题是exec()无法修改函数的局部范围。 这是由于以下事实:Python在本地范围内不使用dict来查找变量,因此exec()所有更改都不会反映回堆栈以启用查找。 这引起了一个奇怪的问题,其中exec()似乎改变了locals()字典,但是Python仍然抛出NameError

def otherfn(codestr):
    z = 2
    exec(codestr)
    print(locals()["y"])  # prints 4
    return y  # NameError

otherfn(code)

这是预期的行为,如issue4831中所述,并在官方文档中进一步加以说明:

注意 :默认本地语言的行为与下面对函数locals()描述相同:不应尝试对默认本地语言字典进行修改。 传递一个明确的当地人解释,如果你需要看后当地人的功能代码的作用exec()的回报。

但是,如果您必须反映更改,则可以执行后执行本地范围更新:

def otherfn(codestr):
    z = 2
    locals_ = locals()
    exec(codestr, globals(), locals_)
    y = locals_["y"]
    return y

otherfn(code)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM