我brian2
用来运行神经网络模拟。为了在每次模拟期间记录数据,我正在创建brian2
'sSpikeMonitor
类的几个实例化。我想将这些监视器存储在使用字典理解创建的字典中。
作为测试,我在交互式会话中执行以下操作:
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>}
一切看起来都很棒。但是现在当我将此代码移动到以下函数中时
def test_record():
pe_mt = brian2.PoissonGroup(1, 100 * brian2.Hz)
record_pops = ['pe_mt']
return {'mon_' + pop: brian2.SpikeMonitor(eval(pop)) for pop in
record_pops}
并调用它,我收到以下错误
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
这里发生了什么?'pe_mt'在函数中定义。
请注意,如果我将 dict 理解更改为列表理解,如
return [brian2.SpikeMonitor(eval(pop)) for pop in record_pops]
没有错误被提出!我得到了一个SpikeMonitor
适当定义的对象列表。
现在已被删除的答案建议我使用locals()[pop]
而不是eval(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'