Python:在将字符串转换为numpy数组的名称时使用eval()时出错

时间:2012-07-23 18:35:29

标签: python numpy eval

我在名为numpy的模块中有两个名为dec_pairdec_community的{​​{1}}数组,初始化为零:

config.py

现在,我试图从其他模块中访问它们,比如dec_pair = numpy.zeros(200) dec_community = numpy.zeros(200) ,它们的名称是根据输入变量形成的,即

roc.py

其中import config def dosomething(name): local_name = 'config.py'+name eval(local_name)[i:] += 1 可以是namepair。问题是,community返回eval(local_name)数组的长度,即numpy,而不是数组本身,这给了我这个错误:

  

ValueError:无法切片0-d数组

然而,当我在python解释器上做同样的事情时,它运行顺利:

200

知道我做错了什么,以及做正确的方法是什么?

2 个答案:

答案 0 :(得分:5)

呸。

首先,不要使用eval()。你会度过一段美好的时光。

其次,只需导入配置!在roc.py

def dosomething(numpy_array):
    return somefunction(numpy_array)

在其他一些模块中:

import roc
import config
someresult = roc.somefunction(config.dec_pair)

编辑:重新阅读您的问题后,我相信您正在尝试使用全球价值观。这几乎总是表明设计不佳。您应该将“全局”变量的使用限制为单个脚本,并使用函数来传递这些对象。

答案 1 :(得分:3)

你想要做的事情看起来像是一个坏主意(虽然我很难弄清楚你想要做什么)。

我的第一直觉是说你的配置文件中可能需要numpy.zeros(200)而不是numpy.array(200)

其次,如果导入了这些内容,您可以使用globals()[local_name]vars(config)[local_name]来获取数据,而不是eval,尽管这仍然是不好的做法(换句话说, 请不要这样做 - 请参阅第3点)。

第三,如果您提前不知道变量的名称,您应该使用字典开头,例如

#config.py
dec={'pair':np.zeros(200), 'community':np.zeros(200)}

现在您只需在函数中访问它们:

a=config.dec[name]
a[i:]+=1

如果您希望更轻松地处理dec_pairdec_community,可以像config.py一样:

dec_pair=np.zeros(200)
dec_community=np.zeros(200)
dec={'pair':dec_pair, 'community':dec_community}

虽然我可能会说最好只将参考数据保留在1个位置,所以除非你真的需要以保持API一致或其他什么,否则我会提醒你不要这样做。

最后,您还没有提到变量i的值是什么 - 访问当前命名空间之外的变量通常存在风险,而名为i的变量可能更具风险。