Python';s eval()和globals()
我正在尝试使用eval()执行许多函数,我需要为它们创建某种运行环境。文档中说可以将globals作为第二个参数传递给eval() 但对我来说似乎不起作用。下面是一个简化的示例(我尝试了两种方法,声明变量global和使用globals(),但都不起作用): 文件script.py: 文件test.py: 我得到: NameError:未定义全局名称“测试变量” 我应该怎么做才能将Python';s eval()和globals(),python,eval,Python,Eval,我正在尝试使用eval()执行许多函数,我需要为它们创建某种运行环境。文档中说可以将globals作为第二个参数传递给eval() 但对我来说似乎不起作用。下面是一个简化的示例(我尝试了两种方法,声明变量global和使用globals(),但都不起作用): 文件script.py: 文件test.py: 我得到: NameError:未定义全局名称“测试变量” 我应该怎么做才能将test\u变量传递到my\u func()?假设我不能将其作为参数传递。test\u变量在test.py中应该是全
test\u变量
传递到my\u func()
?假设我不能将其作为参数传递。test\u变量在test.py中应该是全局变量。您得到一个名称错误,因为您试图声明一个尚不存在的全局变量
因此,您的my_test.py文件应该如下所示:
test_variable = None
def my_func():
print test_variable
并在命令提示符下运行此命令:
>>> import my_test
>>> eval('my_test.my_func()')
None
>>> my_test.test_variable = 'hello'
>>> my_test.test_variable
'hello'
>>> eval('my_test.my_func()')
hello
一般来说,使用eval()和globals是不好的,所以请确保您知道自己在做什么。如果我错了,请纠正我的Python专家。我也在学习Python。以下是我目前对引发namererror
异常的原因的理解
在Python中,如果不指定模块名称,就无法创建可以跨模块访问的变量(即,要在模块mod1
中访问全局变量test
,需要在模块mod2
中使用mod1.test
)。全局变量的范围几乎仅限于模块本身
因此,当您在test.py
中有以下内容时:
def my_func():
global test_variable
print repr(test_variable)
import test
test.test_variable = 'test_value'
eval('test.my_func()')
此处的test\u变量
指test.test\u变量
(即test
模块名称空间中的test\u变量
)
因此,在script.py
中设置test\u variable
将把变量放在\uuuuuu main\uuuu
命名空间中(\uuuuu main\uuuu
因为这是您提供给Python解释器执行的顶级模块/脚本)。因此,此test_变量
将位于不同的命名空间中,而不是位于需要它的test
模块命名空间中。因此,Python生成一个namererror
,因为它在搜索test
模块全局名称空间和内置名称空间后找不到变量(由于global
语句,本地函数名称空间被跳过)
因此,要使eval
工作,您需要在script.py
中的test
模块名称空间中设置test\u变量
:
def my_func():
global test_variable
print repr(test_variable)
import test
test.test_variable = 'test_value'
eval('test.my_func()')
有关Python作用域和名称空间的更多详细信息,请参见:抱歉,但最后一句是“假设我无法将其作为参数传递。”
test.py中的全局test_变量
也不起作用,我想这是因为它位于另一个模块中,并且您正在解释器中运行该代码。抱歉,浏览习惯不好,请尝试一下