Python中的枚举不符合预期

2024-04-23 18:37:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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不起作用。在


Tags: 类型objectstepstaticanalysisenumstepsconditions
1条回答
网友
1楼 · 发布于 2024-04-23 18:37:32

在评论中,你说:

The input file contains many steps, and every time I add a new step I have to set up the analysis type

如果我没听错的话,你的意思是每次添加新步骤时都会创建一个新的Enum对象。这可能就是为什么你看到你的“虫子”。两个不同的Enum对象的值尽管具有相同的名称和顺序,但并不一定是相等的。例如:

import enum
Analysis1 = enum.Enum("Analysis", "static dynamic")
Analysis2 = enum.Enum("Analysis", "static dynamic")

但是:

^{pr2}$

发生这种情况的原因是,据我所知,没有为Enum对象定义相等运算符,因此使用了检查ids的默认行为。在

正如@martineau在评论中建议的那样,避免这个问题的一种方法是使用IntEnum类型,它是int的子类,因此根据Enum的值而不是id来定义相等运算符:

import enum
Analysis1 = enum.IntEnum("Analysis", "static dynamic")
Analysis2 = enum.IntEnum("Analysis", "static dynamic")

然后:

>>> Analysis1.static == Analysis2.static
True

为什么有EnumIntEnum?在

乍一看,似乎IntEnum总是我们想要的。那么Enum的意义是什么?在

假设您要列举两组项目,例如水果和颜色。现在,“橙色”既是一种水果,也是一种颜色。所以我们写下:

Fruits = enum.IntEnum("Fruits", "orange apple lemon")
Colors = enum.IntEnum("Colors", "orange red blue")

但现在:

>>> Fruits.orange == Colors.orange
True

但是,从哲学上讲,“橘子”(水果)和“橘子”(颜色)是不一样的!难道我们不能区分这两者吗?在这里,IntEnumint的子类化对我们不利,因为Fruits.orange和{}都等同于{}。当然,如上所述,Enums的比较是ids,而不是值。由于Fruits.orange和{}是唯一的对象,因此它们的比较并不相等:

Fruits = enum.Enum("Fruits", "orange apple lemon")
Colors = enum.Enum("Colors", "orange red blue")

因此:

>>> Fruits.orange == Colors.orange
False

我们不再生活在一个你可以在当地杂货店的农产品区找到一些颜色的东西的世界。在

相关问题 更多 >