Python枚举。枚举创建别名而不是新值

时间:2018-06-26 08:13:49

标签: python enums alias defaultdict

我只是注意到pyhton中Enum + defaultdict的行为很奇怪。我定义了一个这样的枚举,它收集了一些默认的字典:

from enum import Enum
from collections import defaultdict

class A(Enum):
     a = defaultdict(lambda: 1)
     b = defaultdict(lambda: 2)

然后,当我看一下A里面的东西时:

In [11]: A.a
Out[11]: <A.a: defaultdict(<function A.<lambda> at 0x7f773f03b510>, {})>

In [12]: A.b
Out[12]: <A.a: defaultdict(<function A.<lambda> at 0x7f773f03b510>, {})>

因此A.b只是A.a的别名。在我看来,这似乎很像个虫子,即使背后可能有很好的理由。有想法吗?

附录

自从注释中弹出该注释后,便说明了为什么要在Enum中放入字典。我发现将常量分组到命名空间中通常很有用,这样人们就可以访问A.a.constant1A.b.constant1等值。目前,尝试使用Enums会引发{{1 }}。当然,可以做类似的事情:

AttributeError

但是,这没有利用Enum的功能(迭代,通过class A: class a(Enum): constant1 = 1 class b(Enum): constant1 = 2 的访问等)。

1 个答案:

答案 0 :(得分:3)

如果给两个枚举成员相等的值,则enum将产生一个带有两个别名而不是两个不同成员的枚举成员。

Defaultdicts从dict继承相等性比较。这意味着默认工厂不属于==比较的一部分。您的枚举成员具有相等的值,因此它们会合并在一起。

使用可变对象作为枚举值通常是一个坏主意。他们倾向于打破enum设计假设,例如“价值平等不变”。考虑以其他方式将这些默认字典附加到枚举成员上。