在类定义期间,定义为字典的类变量用于构建第二个字典类变量,这是从第一个缩减而来的子集,如下所示:
class C(object):
ALL_ITEMS = dict(a='A', b='B', c='C', d='D', e='E')
SUBSET_X = {k: v for k, v in ALL_ITEMS.items() if k in ('a', 'b', 'd')} # (this works)
SUBSET_Y = {k: ALL_ITEMS[k] for k in ('a', 'b', 'd')} # (this fails)
Run Code Online (Sandbox Code Playgroud)
非常简单的东西,但执行这段代码的最终效果让我感到非常惊讶。我的第一种方法是第 4 行的代码,但我不得不求助于第 3 行的解决方案。关于字典理解范围规则的一些微妙之处,我显然没有掌握。
具体来说,失败案例中引发的错误是:
File "goofy.py", line 4, in <dictcomp>
SUBSET_Y = {k: ALL_ITEMS.get(k) for k in ('a', 'b', 'd')}
NameError: name 'ALL_ITEMS' is not defined
Run Code Online (Sandbox Code Playgroud)
由于几个不同的原因,这个错误的性质让我感到困惑:
SUBSET_Y是一个格式良好的字典理解,并引用一个应该在范围内且可访问的符号。SUBSET_X),这也是一个字典理解,该符号ALL_ITEMS是完全明确且可访问的。因此,NameError …