我在Python的Enum类中发现了一个非常奇怪的行为。所以枚举类型很简单:
from enum import Enum
Analysis = Enum('Analysis', 'static dynamic')
因此,我将此枚举类型用于步骤对象,以便它们将其存储在属性分析中,如下所示:
^{pr2}$到目前为止非常简单,所以当我在列表中有几个步骤时,我会尝试查看枚举类型,并且它已经被正确分配。但他们并不平等:
# loop over steps
for s, step in enumerate(kwargs['steps']):
print(kwargs)
print(step)
print(step.analysis)
print("test for equality: ",(step.analysis == Analysis.static))
quit()
哪个指纹
{'mesh': <fem.mesh.mesh.Mesh object at 0x10614d438>,
'steps': [<hybrida.fem.step.Step object at 0x10614d278>,
<hybrida.fem.step.Step object at 0x10616a710>,
<hybrida.fem.step.Step object at 0x10616a390>]}
Step:
analysis: Analysis.static
bcs: [<hybrida.fem.conditions.dirichlet.Dirichlet object at 0x10616a0f0>,
<hybrida.fem.conditions.dirichlet.Dirichlet object at 0x10616a320>,
<hybrida.fem.conditions.dirichlet.Dirichlet object at 0x10616a3c8>,
<hybrida.fem.conditions.dirichlet.Dirichlet object at 0x10616a470>,
<hybrida.fem.conditions.dirichlet.Dirichlet object at 0x10616a518>,
<hybrida.fem.conditions.dirichlet.Dirichlet object at 0x10616a5c0>,
<hybrida.fem.conditions.dirichlet.Dirichlet object at 0x10616a668>]
Analysis.static
test for equality: False
这是不正确的,但我不知道如何调试它。在
更新
根据@martineau的建议,我创建了一个IntEnum
,这解决了我的问题。然而,我不明白为什么正常的Enum
不起作用。在
在评论中,你说:
如果我没听错的话,你的意思是每次添加新步骤时都会创建一个新的
Enum
对象。这可能就是为什么你看到你的“虫子”。两个不同的Enum
对象的值尽管具有相同的名称和顺序,但并不一定是相等的。例如:但是:
^{pr2}$发生这种情况的原因是,据我所知,没有为
Enum
对象定义相等运算符,因此使用了检查id
s的默认行为。在正如@martineau在评论中建议的那样,避免这个问题的一种方法是使用
IntEnum
类型,它是int
的子类,因此根据Enum
的值而不是id
来定义相等运算符:然后:
为什么有
Enum
和IntEnum
?在乍一看,似乎
IntEnum
总是我们想要的。那么Enum
的意义是什么?在假设您要列举两组项目,例如水果和颜色。现在,“橙色”既是一种水果,也是一种颜色。所以我们写下:
但现在:
但是,从哲学上讲,“橘子”(水果)和“橘子”(颜色)是不一样的!难道我们不能区分这两者吗?在这里,}都等同于{}。当然,如上所述,}是唯一的对象,因此它们的比较并不相等:
IntEnum
的int
的子类化对我们不利,因为Fruits.orange
和{Enum
s的比较是id
s,而不是值。由于Fruits.orange
和{因此:
我们不再生活在一个你可以在当地杂货店的农产品区找到一些颜色的东西的世界。在
相关问题 更多 >
编程相关推荐