![](/img/trans.png)
[英]How to understand an undefined error in a function I'm trying to write
[英]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。
您的代码有几个问题。 首先,您有一个缩进问题y
在return
后在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.