我只是注意到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.constant1
,A.b.constant1
等值。目前,尝试使用Enums会引发{{1 }}。当然,可以做类似的事情:
AttributeError
但是,这没有利用Enum的功能(迭代,通过class A:
class a(Enum):
constant1 = 1
class b(Enum):
constant1 = 2
的访问等)。
答案 0 :(得分:3)
如果给两个枚举成员相等的值,则enum
将产生一个带有两个别名而不是两个不同成员的枚举成员。
Defaultdicts从dict
继承相等性比较。这意味着默认工厂不属于==
比较的一部分。您的枚举成员具有相等的值,因此它们会合并在一起。
使用可变对象作为枚举值通常是一个坏主意。他们倾向于打破enum
设计假设,例如“价值平等不变”。考虑以其他方式将这些默认字典附加到枚举成员上。