Я использую brian2
для запуска нейронных сетевых симуляций. Чтобы записывать данные во время каждого моделирования, я создаю несколько экземпляров класса brian2
SpikeMonitor
. Я хочу хранить эти мониторы в dict, созданный с использованием понимания dict.Dict comprehension производит кажущееся необоснованным NameError
В качестве теста я выполнить следующее в интерактивном режиме:
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'
что 'Eval (поп)' должны делать? –
здесь, 'pop = 'pe_mt'.'' eval (pop) 'дает мне объект' pe_mt', 'SpikeMonitor'. – dbliss
Почему бы просто не сохранить объект? –