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

我只是注意到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会引发AttributeError.当然,可以做类似的事情:

class A:
    class a(Enum):
        constant1 = 1
    class b(Enum):
        constant1 = 2

但是,这没有利用Enum的功能(迭代,通过__getitem__的访问等).

解决方法:

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

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

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

上一篇:python 中的defaultdict 用法


下一篇:python – collections.defaultdict线程安全吗?