0

我有两个numpy名为的数组dec_pairdec_community在一个名为 的模块中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

哪里name可以paircommunity。问题是,eval(local_name)返回数组的长度,numpy200这里而不是数组本身,这给了我这个错误:

ValueError:无法对 0 维数组进行切片

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

>>> dec_pair = numpy.zeros(5)
>>> name = 'pair'
>>> local_name = 'dec_'+name
>>> eval(local_name)
array([ 0.,  0.,  0.,  0.,  0.])

关于我做错了什么以及正确的方法是什么?

4

2 回答 2

5

呸。

首先,不要使用eval(). 你会过得很糟糕。

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

def dosomething(numpy_array):
    return somefunction(numpy_array)

在其他一些模块中:

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

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

于 2012-07-23T18:41:26.507 回答
3

您尝试做的事情看起来是个坏主意(尽管我很难弄清楚您要做什么)。

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

其次,如果这些东西被导入,您可能会使用globals()[local_name]orvars(config)[local_name]来获取您的数据,而不是eval,尽管这仍然是绝对不好的做法(换句话说,请不要这样做 - 请参阅第 3 点)。

第三,当你事先不知道变量的名称时,你应该使用字典开头, 例如

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

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

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

如果您想要更轻松地处理dec_pairand dec_community,您可以这样做config.py

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

尽管我可能会说最好将引用的数据仅保留在 1 个位置,因此我会告诫不要这样做,除非您确实需要保持 API 一致或其他什么。

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

于 2012-07-23T18:54:39.130 回答