我对Python的奇怪行为感到困惑locals()
。
基本上,我想从locals()
字典理解中的字典中获得一个项目,但是失败了。这是非常基本的事情,因此:
>>> foo=123
>>> bar=345
>>> baz=678
>>> {k: locals()[k] for k in ('foo','bar','baz')}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
KeyError: 'foo'
>>> locals()['foo']
123
>>> locale=locals()
>>> {k: locale[k] for k in ('foo','bar','baz')}
{'foo': 123, 'bar': 345, 'baz': 678}
>>> type(locals())
<class 'dict'>
>>> def fun():
... return {'foo': 123,'bar':345}
...
>>> {k: fun()[k] for k in ('foo','bar')}
{'foo': 123, 'bar': 345}
从实际的角度来看{'foo':foo, 'bar': bar}
,字典或字符串中的丑陋等.format()
效果很好。
只是我缺少了一些东西,所以知道为什么会增加我的编码能力(到目前为止,我在编码时不发光)。
由于Python 3中的所有理解都是使用隐藏函数实现的,因此调用locals
不会返回您期望其返回的值。
您可以通过将值打印出来来查看:
>>> _ = {k: print(locals()) for k in ('foo','bar','baz')}
{'k': 'foo', '.0': <tuple_iterator object at 0x7fdf840afa90>}
{'k': 'bar', '.0': <tuple_iterator object at 0x7fdf840afa90>}
{'k': 'baz', '.0': <tuple_iterator object at 0x7fdf840afa90>}
分配locals()
给locale
您,就像您所做的那样。您不是locals
在理解内线。
请注意,在Python 2中,情况有点模糊。dict-comps确实会以类似的方式失败,但是在dict-comps之前的list-comps可以正常工作:
>>> _ = [locals()[k] for k in ('foo', 'bar', 'baz')]
>>> _
[20, 40, 60]
这是Py3解决的另一个“缺陷” 。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句