使用execfile()设置函数变量

时间:2013-09-05 08:10:38

标签: python global-variables user-defined-functions locals

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

#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!

1 个答案:

答案 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()并且您需要自己打开文件。