使用 execfile() 设置函数变量



我正在尝试将信息加载到用户定义的函数中进行进一步处理。由于输入文件必须由非程序员生成,因此我选择了以下格式:

#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(),你需要自己打开文件。

相关内容

  • 没有找到相关文章

最新更新