我在名为numpy
的模块中有两个名为dec_pair
和dec_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
可以是name
或pair
。问题是,community
返回eval(local_name)
数组的长度,即numpy
,而不是数组本身,这给了我这个错误:
ValueError:无法切片0-d数组
然而,当我在python解释器上做同样的事情时,它运行顺利:
200
知道我做错了什么,以及做正确的方法是什么?
答案 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_pair
和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
的变量可能更具风险。