Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python';s eval()和globals()_Python_Eval - Fatal编程技术网

Python';s eval()和globals()

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中应该是全

我正在尝试使用eval()执行许多函数,我需要为它们创建某种运行环境。文档中说可以将globals作为第二个参数传递给eval()

但对我来说似乎不起作用。下面是一个简化的示例(我尝试了两种方法,声明变量global和使用globals(),但都不起作用):

文件script.py: 文件test.py: 我得到:

NameError:未定义全局名称“测试变量”

我应该怎么做才能将
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_变量
也不起作用,我想这是因为它位于另一个模块中,并且您正在解释器中运行该代码。抱歉,浏览习惯不好,请尝试一下