首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用execfile()设置函数变量

用execfile()设置函数变量
EN

Stack Overflow用户
提问于 2013-09-05 08:10:37
回答 1查看 5.1K关注 0票数 3

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

代码语言:javascript
复制
#contents of vessel_data.txt
hull_length = 100000.
hull_width  = 50000.
etc.

然后,我的函数通过execfile()加载输入文件。然后,我希望将数据分组到一个数组中,并将其作为函数的输出传递。大致如此:

代码语言:javascript
复制
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()加载数据是不允许的,但请记住,输入是由非程序员生成的。无论如何,我得到以下错误:

代码语言:javascript
复制
NameError: global name 'hull_length' is not defined

添加这些行后,我可以确认我的变量按预期加载到local名称空间中:

代码语言:javascript
复制
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()命令修改为:

代码语言:javascript
复制
execfile(file_path, globals())

但是我不想把所有的东西都加载到全局名称空间中。

那么,在不将所有内容加载到global名称空间的情况下,如何使它工作呢?

亲切的问候,拉斯摩斯

========编辑=======

根据昆汀的回答,我就是这样做的:

代码语言:javascript
复制
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)

干杯昆廷!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-05 08:40:36

execfile()警告要修改函数局部变量:这是不可能的!

默认局部变量在下面对函数局部变量()进行了描述:不应该尝试对默认局部变量字典进行修改。如果需要在函数execfile()返回后查看代码对局部变量的影响,则传递显式局部变量字典。execfile()不能可靠地用于修改函数的局部变量.

它不是关于execfile(),而是关于局部变量():

代码语言:javascript
复制
def f():
   locals()['a'] = 3
   print(a)

您还将获得NameError: global name 'a' is not defined。这可能是为了优化目的。这里的解决方案是使用字典:

代码语言:javascript
复制
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(),您需要自己打开文件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18631014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档