我正在尝试将信息加载到用户定义的函数中进行进一步处理。由于输入文件必须由非程序员生成,因此我选择了以下格式:
#contents of vessel_data.txt
hull_length = 100000.
hull_width = 50000.
etc.
然后我的函数通过 execfile()
加载输入文件。然后,我想将数据分组到一个数组中,并将其作为函数的输出传递。大致是这样的:
file_path = ..vessel_name.txt
def my_input_func(file_path):
execfile(file_path)
data = np.array([[hull_length],
[hull_width ],
[etc. ]])
return(data)
我知道通过exec()
和execfile()
加载数据是不受欢迎的,但请记住,输入是由非程序员生成的。无论如何,我收到以下错误:
NameError: global name 'hull_length' is not defined
添加这些行后,我可以确认我的变量已按预期加载到local
命名空间中:
print 'Locals: ' + str([x for x in locals() if x[0] == 'h'])
print 'Globals: ' + str([x for x in globals() if x[0] == 'h'])
令我困惑的是,为什么当我尝试定义变量时,我的函数会查看global
名称空间。我的印象是,除非特别说明,否则函数中的所有内容都处理函数本地的名称空间。我可以通过将我的 execfile()
命令修改为:
execfile(file_path, globals())
但我对将所有内容加载到全局名称空间中不感兴趣。
那么,如何在不将所有内容加载到global
名称空间的情况下完成这项工作呢?
亲切问候拉斯穆斯
======== 编辑 =======
这就是我根据昆汀的回答让它工作的方式:
file_path = ..vessel_name.txt
def my_input_func(file_path):
vessel_vars = {}
execfile(file_path, vessel_vars)
data = np.array([[vessel_vars['hull_length']],
[vessel_vars['hull_width'] ],
[vessel_vars['etc.'] ]])
return(data)
昆汀干杯!
execfile() 的文档警告想要修改函数局部变量:这是不可能的!
默认局部变量的行为如下所述: 不应修改默认的局部变量字典 企图。如果需要查看,请传递显式局部变量字典 函数 execfile() 返回后代码对局部变量的影响。 execfile() 不能可靠地用于修改函数的局部变量。
这不是关于execfile(),而是关于locals():
def f():
locals()['a'] = 3
print(a)
你也会得到NameError: global name 'a' is not defined
.这可能是出于优化目的。这里的解决方案是使用字典:
file_path = os.path.join('..', 'vessel_name.txt')
def my_input_func(file_path):
vessel = {}
execfile(file_path, vessel)
data = np.array([[vessel['hull_length']],
[vessel['hull_width'],
[vessel['etc.']])
return(data)
注意:我假设你使用的是Python 2,但在Python 3中是一样的,除了execfile()现在是exec(),你需要自己打开文件。