听写理解产生看似不合理的名字

2024-06-16 13:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我用brian2来运行神经网络模拟。为了在每次模拟期间记录数据,我创建了brian2SpikeMonitor类的几个实例化。我想把这些监视器存储在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'

Tags: indebugtestnonefortestsbrian2record
2条回答

不推荐的解决方法:

def test_record():
    pe_mt = brian2.PoissonGroup(1, 100 * brian2.Hz)
    record_pops = ['pe_mt']
    my_loc = locals()
    return {'mon_' + pop: brian2.SpikeMonitor(eval(my_loc[pop])) for pop in
            record_pops}

或者使用一个普通的循环来构建您的dict:

^{pr2}$

或者简单地使用dict来保存对象:

def test_record():
    d = {"pe_mt":brian2.PoissonGroup(1, 100 * brian2.Hz)}
    record_pops = ['pe_mt']
    return {'mon_' + pop: brian2.SpikeMonitor(d[pop]) for pop in record_pops}

第一:忘记eval,因为如果传递给它的字符串是表达式或函数调用,而不是标识符,那么它可能会导致意外的事情发生。如果真的需要按名称获取局部变量,可以使用^{。在

文档:^{}


第二个:所有的理解和生成器表达式(python2.x中的list comprehension除外)have their own namespace,因此,理解中的locals()将引用该表达式-没有变量的表达式。eval与{a3}相同:

If the locals dictionary is omitted it defaults to the globals dictionary. If both dictionaries are omitted, the expression is executed in the environment where eval() is called.

你可以通过提前得到它们来解决这个问题:

def test_record():
    pe_mt = brian2.PoissonGroup(1, 100 * brian2.Hz)
    record_pops = ['pe_mt']
    groups = locals()    
    return {'mon_' + pop: brian2.SpikeMonitor(eval(pop, globals(), groups)) for pop in record_pops}
    # or better
    return {'mon_' + pop: brian2.SpikeMonitor(groups[pop]) for pop in record_pops}

或者更传统地说,没有locals

^{pr2}$

相关问题 更多 >