Python enum.Enum 创建别名而不是新值
Python enum.Enum creates alias instead of new value
我刚刚注意到 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
的别名。这对我来说很像一个错误,即使背后可能有一些充分的理由。有什么想法吗?
附录
由于它出现在评论中,因此请注意为什么要将字典放入枚举中。我发现将常量分组到命名空间中通常很有用,这样人们就可以访问 A.a.constant1
、A.b.constant1
等值。目前,尝试使用 Enums 这样做会引发 AttributeError
.当然,可以这样做:
class A:
class a(Enum):
constant1 = 1
class b(Enum):
constant1 = 2
但是,这并没有利用 Enum 的功能(迭代、通过 __getitem__
访问等)。
如果您为两个枚举成员赋予相等的值,enum
将生成一个具有两个别名的枚举成员,而不是两个不同的成员。
Defaultdicts 继承了 dict
的相等性比较。这意味着默认工厂不是 ==
比较的一部分。您的枚举成员具有相同的值,因此它们会被合并。
使用可变对象作为枚举值通常不是一个好主意。他们倾向于打破 enum
设计假设,例如 "value equality doesn't change"。考虑以其他方式将这些 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
的别名。这对我来说很像一个错误,即使背后可能有一些充分的理由。有什么想法吗?
附录
由于它出现在评论中,因此请注意为什么要将字典放入枚举中。我发现将常量分组到命名空间中通常很有用,这样人们就可以访问 A.a.constant1
、A.b.constant1
等值。目前,尝试使用 Enums 这样做会引发 AttributeError
.当然,可以这样做:
class A:
class a(Enum):
constant1 = 1
class b(Enum):
constant1 = 2
但是,这并没有利用 Enum 的功能(迭代、通过 __getitem__
访问等)。
如果您为两个枚举成员赋予相等的值,enum
将生成一个具有两个别名的枚举成员,而不是两个不同的成员。
Defaultdicts 继承了 dict
的相等性比较。这意味着默认工厂不是 ==
比较的一部分。您的枚举成员具有相同的值,因此它们会被合并。
使用可变对象作为枚举值通常不是一个好主意。他们倾向于打破 enum
设计假设,例如 "value equality doesn't change"。考虑以其他方式将这些 defaultdict 附加到您的枚举成员。