Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 听写理解会产生看似不必要的错误_Python_Scope_List Comprehension_Python Internals_Dictionary Comprehension - Fatal编程技术网

Python 听写理解会产生看似不必要的错误

Python 听写理解会产生看似不必要的错误,python,scope,list-comprehension,python-internals,dictionary-comprehension,Python,Scope,List Comprehension,Python Internals,Dictionary Comprehension,我正在使用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
来运行神经网络模拟。为了在每次模拟期间记录数据,我创建了几个
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>}
并调用它,我得到以下错误

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
没有出现错误!我得到一个适当定义的
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'
[20]中的
tests.test\u记录()
---------------------------------------------------------------------------
KeyError回溯(最近一次呼叫最后一次)
在()
---->1测试。测试记录()
/测试记录()中的home/daniel/Science/dopa_net/brian/ardid/tests.py
61记录_pops=['pe_mt']
62返回{'mon_'+pop:brian2.SpikeMonitor(locals()[pop]),用于pop-in
--->63记录_pops}
64#调试###################
65#监视器=utils.record(['pe#mt','spikes',None,None,pe#mt,None,None)
/home/daniel/Science/dopa_net/brian/ardid/tests.py in((pop,))
60#调试###################
61记录_pops=['pe_mt']
--->62返回{'mon_'+pop:brian2.SpikeMonitor(locals()[pop]),用于pop-in
63记录_pops}
64#调试###################
KeyError:“pe_mt”

一:忘记
eval
,因为如果传递给它的字符串是表达式或函数调用,而不是标识符,那么它可能会导致意外情况发生。如果确实需要按名称获取局部变量,可以使用
locals()[name]
干净地获取

文件:


第二:所有理解和生成器表达式(Python2.x中的列表理解除外),因此理解中的
locals()
将引用该表达式,即没有变量的表达式。这同样适用于
eval
,即:

如果省略了局部字典,则默认为全局字典。如果省略了这两个字典,则表达式将在调用eval()的环境中执行

您可以通过提前获得它们来解决这一问题:

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}
或者更常规地,没有
局部变量

def test_record():
    groups = {
        "pe_mt": brian2.PoissonGroup(1, 100 * brian2.Hz),
    }
    return {'mon_' + key: brian2.SpikeMonitor(value) for key, value in groups.iteritems()}

不推荐的解决方法:

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:

def test_record():
    pe_mt = brian2.PoissonGroup(1, 100 * brian2.Hz)
    record_pops = ['pe_mt']
    d = {}
    for pop in record_pops:
        d['mon_' + pop] = brian2.SpikeMonitor(locals()[pop]))
    return d
或者简单地使用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(pop)
应该做什么?在这里,
pop='peu mt.
eval(pop)
给了我一个
peu mt
对象,一个
SpikeMonitor
。为什么不直接存储这个对象呢?我很困惑。存储对象正是我想做的。你的问题是dict理解有它自己的局部作用域。你能证明
locals()。此外,在这里,您必须事先构造
局部变量
,因此调用
eval
从该字典中获取一个值是非常迂回的,因为它会阻止编译器优化您的代码。您有什么建议?那么这段代码会阻止优化吗?是否有人必须使用eval?如果最后一个代码块的实用程序只在必须使用eval的情况下才使用,那么包含它似乎很愚蠢。@dbliss,您是否手动创建了所有对象?我看不出你的代码在结构上有什么优势。您可以直接存储对象基本上
return{'mon_uu'+str(ind):brian2.SpikeMonitor(pop)for ind,pop in enumerate(record_pops)}
或者如果您想保留一个全局计数器,它将在对象添加到dict时递增,请使用
itertools.count()
在代码开头声明它
def test_record():
    pe_mt = brian2.PoissonGroup(1, 100 * brian2.Hz)
    record_pops = ['pe_mt']
    d = {}
    for pop in record_pops:
        d['mon_' + pop] = brian2.SpikeMonitor(locals()[pop]))
    return d
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}