我用brian2
来运行神经网络模拟。为了在每次模拟期间记录数据,我创建了brian2
的SpikeMonitor
类的几个实例化。我想把这些监视器存储在dict中,用dict理解创建。在
作为测试,我在交互式会话中执行以下操作:
In [1]: import brian2
In [2]: pe_mt = brian2.PoissonGroup(1, 100 * brian2.Hz)
In [3]: record_pops = ['pe_mt']
In [4]: {'mon_' + pop: brian2.SpikeMonitor(eval(pop)) for pop in record_pops}
Out[4]: {'mon_pe_mt': <SpikeMonitor, recording spikemonitor>}
一切看起来都很好。但是现在当我把代码移到下面的函数中时
^{pr2}$调用它,我得到以下错误
In [9]: tests.test_record()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-9-4d3d585b2c97> in <module>()
----> 1 tests.test_record()
/home/daniel/Science/dopa_net/brian/ardid/tests.py in test_record()
61 record_pops = ['pe_mt']
62 return {'mon_' + pop: brian2.SpikeMonitor(eval(pop)) for pop in
---> 63 record_pops}
64 # DEBUG ###################
65 #monitors = utils.record(['pe_mt'], 'spikes', None, None, pe_mt, None, None)
/home/daniel/Science/dopa_net/brian/ardid/tests.py in <dictcomp>((pop,))
60 # DEBUG ###################
61 record_pops = ['pe_mt']
---> 62 return {'mon_' + pop: brian2.SpikeMonitor(eval(pop)) for pop in
63 record_pops}
64 # DEBUG ###################
/home/daniel/Science/dopa_net/brian/ardid/tests.py in <module>()
NameError: name 'pe_mt' is not defined
这是怎么回事?”peu mt'在函数中定义。在
请注意,如果我将dict理解更改为列表理解,如
return [brian2.SpikeMonitor(eval(pop)) for pop in record_pops]
没有出错!我得到了一个SpikeMonitor
对象的列表,并进行了适当的定义。在
一个已经被删除的答案建议我使用locals()[pop]
而不是{
In [20]: tests.test_record()
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-20-4d3d585b2c97> in <module>()
----> 1 tests.test_record()
/home/daniel/Science/dopa_net/brian/ardid/tests.py in test_record()
61 record_pops = ['pe_mt']
62 return {'mon_' + pop: brian2.SpikeMonitor(locals()[pop]) for pop in
---> 63 record_pops}
64 # DEBUG ###################
65 #monitors = utils.record(['pe_mt'], 'spikes', None, None, pe_mt, None, None)
/home/daniel/Science/dopa_net/brian/ardid/tests.py in <dictcomp>((pop,))
60 # DEBUG ###################
61 record_pops = ['pe_mt']
---> 62 return {'mon_' + pop: brian2.SpikeMonitor(locals()[pop]) for pop in
63 record_pops}
64 # DEBUG ###################
KeyError: 'pe_mt'
不推荐的解决方法:
或者使用一个普通的循环来构建您的dict:
^{pr2}$或者简单地使用dict来保存对象:
第一:忘记。在
eval
,因为如果传递给它的字符串是表达式或函数调用,而不是标识符,那么它可能会导致意外的事情发生。如果真的需要按名称获取局部变量,可以使用^{文档:^{}
第二个:所有的理解和生成器表达式(python2.x中的list comprehension除外)have their own namespace,因此,理解中的
locals()
将引用该表达式-没有变量的表达式。eval
与{a3}相同:你可以通过提前得到它们来解决这个问题:
或者更传统地说,没有
^{pr2}$locals
:相关问题 更多 >
编程相关推荐