【问题标题】:Subscripting locals() in a dict comprehension fails with KeyError [duplicate]在字典理解中下标 locals() 失败并出现 KeyError [重复]
【发布时间】:2017-10-21 11:28:31
【问题描述】:

我对 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}

在实际方面,dict 或字符串中的 {'foo':foo, 'bar': bar} 等丑陋的 .format() 工作正常。
只是我错过了一些东西,所以知道为什么会增加我的编码chi(截至目前我在编码时不发光)。

【问题讨论】:

  • 我会说{k: locals()[k] for k in ('foo','bar','baz')}{'foo': foo, 'bar': bar, ...}很多
  • 一个 dictcomp 引入了它自己的作用域,所以它的 locals() 不包括你的变量...
  • @coldspeed,对不起。我想这是一个关于什么是丑陋的语义问题——这很奇怪。在 longiness=ugly 方案下,并且在三个变量以下的情况下, locals() 方式肯定更丑。在难以辨认/看起来像 Perl 的方案下, locals() 方式总是更丑陋。但在该方案下,locals() 方式的 smart/lower-prob-of-typo 是赢家。
  • 话虽如此,我只是看着我的屏幕:return json.dumps({'data': {'raw': raw, 'nt': Q.codon_peak_freq, 'AAemp': Q.empirical_AA_probabilities,'AAscheme': Q.scheme_AA_probabilities, 'Qpool': Q.Qpool}, 'html': html}),这很好,除了我更改了一些键名,这无疑是令人困惑的,因此很难看。 (捂脸)
  • @Matteo 在您的示例中,写作:dict(foo=123, bar=456, baz=789) 也是一种选择

标签: python python-3.x dictionary


【解决方案1】:

因为 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 的 addressed

【讨论】:

  • 哈!这就解释了。 {k: globals()[k] for k in ('foo','bar','baz')} 工作!
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多