我正在尝试将信息加载到用户定义的函数中以进行进一步处理。由于输入文件必须由非程序员生成,因此我选择了以下格式:
#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)
Cheers Quentin!
答案 0 :(得分:4)
docs for execfile()警告想要修改函数局部变量:这是不可能的!
默认的locals的行为如下面的函数locals()所述: 不应修改默认的本地词典 尝试。如果需要,请传递显式的本地词典 函数execfile()返回后代码对locals的影响。 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()并且您需要自己打开文件。