gpt4 book ai didi

python - 使用 execfile() 设置函数变量

转载 作者:行者123 更新时间:2023-11-28 22:53:59 24 4
gpt4 key购买 nike

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

#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 namespace 中:

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 namespace 。我的印象是,除非特别说明,否则函数内部的所有内容都处理函数本地的 namespace 。我可以通过修改我的 execfile() 命令使其工作:

execfile(file_path, globals())

但我对将所有内容加载到全局 namespace 不感兴趣。

那么,如何在不将所有内容加载到 global namespace 的情况下完成这项工作?

亲切的问候,拉斯穆斯

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

这就是我根据 Quentin 的回答使其工作的方式:

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)

干杯昆汀!

最佳答案

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

The default locals act as described for function locals() below: modifications to the default locals dictionary should not be attempted. Pass an explicit locals dictionary if you need to see effects of the code on locals after function execfile() returns. execfile() cannot be used reliably to modify a function’s locals.

这不是关于 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() 并且您需要自己打开文件。

关于python - 使用 execfile() 设置函数变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18631014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com