ajc*_*ajc 3 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)
Run Code Online (Sandbox Code Playgroud)
然后,当我查看 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>, {})>
Run Code Online (Sandbox Code Playgroud)
SoA.b只是 的别名A.a。对我来说,这看起来很像一个错误,即使背后可能有一些充分的理由。任何想法?
附录
由于它出现在评论中,因此需要说明为什么要在枚举中放入字典。我发现将常量分组到命名空间中通常很有用,这样就可以访问A.a.constant1、A.b.constant1等值。目前,尝试使用 Enums 执行此操作会引发AttributeError. 当然,人们可以这样做:
class A:
class a(Enum):
constant1 = 1
class b(Enum):
constant1 = 2
Run Code Online (Sandbox Code Playgroud)
然而,这并没有利用 Enum 的功能(迭代、访问__getitem__等)。
如果给两个枚举成员相等的值,enum将生成一个具有两个别名的枚举成员,而不是两个不同的成员。
Defaultdicts 从 继承相等比较dict。这意味着默认工厂不属于==比较的一部分。您的枚举成员具有相同的值,因此它们会被合并。
使用可变对象作为枚举值通常是一个坏主意。他们倾向于打破enum“价值平等不会改变”等设计假设。考虑以其他方式将这些默认字典附加到您的枚举成员。
| 归档时间: |
|
| 查看次数: |
3583 次 |
| 最近记录: |