函数在 exec 中看不到带有提供的局部变量的局部变量
Function does not see locals in exec with supplied locals
考虑这个工作代码:
x=123
def printx():
print(x)
如果我执行 printx()
输出将是 123
因为 x
值存在于 locals()
并且 printx
看到了。
我也可以像这样获得 x
值:
locals()["x"]
但是我需要 运行 我在 exec 中的函数提供了全局和局部参数,所以我写了这段代码,它的目的应该与第一个片段相同:
glo = dict()
loc = dict()
exec('x=123', glo, loc)
exec('def printx():\n print(x)', glo, loc)
但是,当我调用 printx()
时,我得到了这个错误:
exec('printx()', glo, loc)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
File "<string>", line 2, in printx
NameError: name 'x' is not defined
然而 loc["x"]
和 eval('x', glo, loc)
return 123
都符合预期。
如何使局部变量和全局变量可用于我的 printx
函数?
我希望 printx
在具有上下文的 exec
中表现相同?
如果提供了本地字典,则在该本地名称空间中“eval”运行。所有更改都在该本地名称空间中。您可以通过在命令后打印 loc
来查看。 x
和 printx
都在该名称空间中。调用函数会建立一个新的本地命名空间。 Python 不嵌套命名空间,因此它可用的只有新的(空的)本地命名空间和全局命名空间,而 x
不在其中。
您应该 运行 您的前两个 eval
仅使用全局命名空间。那样的话,你的代码就会工作,即使它是一种可怕的 Python 编程方式。
考虑这个工作代码:
x=123
def printx():
print(x)
如果我执行 printx()
输出将是 123
因为 x
值存在于 locals()
并且 printx
看到了。
我也可以像这样获得 x
值:
locals()["x"]
但是我需要 运行 我在 exec 中的函数提供了全局和局部参数,所以我写了这段代码,它的目的应该与第一个片段相同:
glo = dict()
loc = dict()
exec('x=123', glo, loc)
exec('def printx():\n print(x)', glo, loc)
但是,当我调用 printx()
时,我得到了这个错误:
exec('printx()', glo, loc)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 1, in <module>
File "<string>", line 2, in printx
NameError: name 'x' is not defined
然而 loc["x"]
和 eval('x', glo, loc)
return 123
都符合预期。
如何使局部变量和全局变量可用于我的 printx
函数?
我希望 printx
在具有上下文的 exec
中表现相同?
如果提供了本地字典,则在该本地名称空间中“eval”运行。所有更改都在该本地名称空间中。您可以通过在命令后打印 loc
来查看。 x
和 printx
都在该名称空间中。调用函数会建立一个新的本地命名空间。 Python 不嵌套命名空间,因此它可用的只有新的(空的)本地命名空间和全局命名空间,而 x
不在其中。
您应该 运行 您的前两个 eval
仅使用全局命名空间。那样的话,你的代码就会工作,即使它是一种可怕的 Python 编程方式。