为什么在构建仅具有非零长度的元组时访问类属性
foo
会失败?
class Foo:
foo = 42
bar_ok1 = (foo for _ in range(10))
bar_ok2 = tuple(foo for _ in [])
bar_fail1 = tuple(foo for _ in range(10))
bar_fail2 = tuple(foo for _ in [0, 1, 2])
Traceback (most recent call last):
File "main.py", line 1, in <module>
class Foo:
File "main.py", line 7, in Foo
bar_fail1 = tuple(foo for _ in range(10))
File "main.py", line 7, in <genexpr>
bar_fail1 = tuple(foo for _ in range(10))
NameError: name 'foo' is not defined
那是因为 `bar_ok1 尚未评估,因为它定义了一个生成器,并且在类定义中未访问 foo 值。 bar_ok2 也是如此,因为它根本不执行迭代(空列表)。
相比之下,bar_fail* 属性是根据类定义进行评估的。
运行以下命令,您会发现 bar_ok1 失败:
class Foo:
foo = 42
bar_ok1 = (foo for _ in range(10))
bar_ok2 = tuple(foo for _ in [])
#bar_fail1 = tuple(foo for _ in range(10))
#bar_fail2 = tuple(foo for _ in [0, 1, 2])
list(Foo.bar_ok1)