小编tre*_*ant的帖子

使用字典理解的 Python 类变量赋值

在类定义期间,定义为字典的类变量用于构建第二个字典类变量,这是从第一个缩减而来的子集,如下所示:

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)

由于几个不同的原因,这个错误的性质让我感到困惑:

  1. 分配给SUBSET_Y是一个格式良好的字典理解,并引用一个应该在范围内且可访问的符号。
  2. 在后一种情况下(对 的赋值SUBSET_X),这也是一个字典理解,该符号ALL_ITEMS是完全明确且可访问的。因此,NameError …

python dictionary class scoping

2
推荐指数
1
解决办法
340
查看次数

标签 统计

class ×1

dictionary ×1

python ×1

scoping ×1