在我的程序中使用Python将int转换为枚举?

时间:2015-08-17 01:03:16

标签: python python-2.7 python-3.x casting enums

如何在python中将int强制转换为enum

3 个答案:

答案 0 :(得分:9)

如果您希望灵活地在int和枚举之间进行转换,则可以使用enum.IntEnum

import enum

class Color(enum.IntEnum):
    green = 1
    blue = 2
    red = 3
    yellow = 4

color_code = 4
# cast to enum
color = Color(color_code)

# cast back to int
color_code = int(color)

注意:如果您使用的是python< 3.4,enum已被移植,但您需要安装它,例如通过pip install enum

有关python中枚举的更多信息 - https://docs.python.org/3/library/enum.html

答案 1 :(得分:1)

您可以使用内置的Enum(Python 3.4+),enum34 backport,或者,对于更高级的需求(不是这样),新的aenum

如果您使用IntEnum

class RGB(IntEnum):
    red = 1
    green = 2
    blue = 3

如果您有int并且想要匹配的Enum成员:

>>> c = 2
>>> c = RGB(c)
>>> c
<RGB.green: 2>

拥有IntEnum成员后,它已经是int

>>> type(c)
<enum 'RGB'>
>>> isinstance(c, int)
True

IntEnum的缺点是每个IntEnum成员将与具有相同值的每个其他IntEnum成员进行比较:

class Fruit(IntEnum):
    banana = 1

>>> Fruit.banana == Color.red
True

如果您希望将Enum分开,但又不想失去int IntEnum的{​​{1}}能力:

class RGB(Enum):
    red = 1
    green = 2
    blue = 3
    def __int__(self):
        return self.value

Lookup的工作方式相同:

>>> c = 2
>>> c = RGB(c)
>>> c
<RGB.green: 2>

但成员不再是int s:

>>> type(c)
<enum 'RGB'>
>>> isinstance(c, int)
False

所以你必须强制转换它(或访问value属性):

>>> int(c)
2
>>> c.value
2

如果Fruit.banana等于RGB.red

,我们就不再有问题了
>>> Fruit(1) == RGB(1)
False

如果你使用的是Python 3+,那么你可以使用aenum做一些很酷的事情,例如:

import aenum

class RGB(aenum.Enum, start=1):
    red
    green
    blue
    def __int__(self):
        return self.value

导致与上一个Enum示例相同的类。

答案 2 :(得分:0)

对于最新的Python 3.7和一些枚举:

from enum import Enum

class BatteryState(Enum):
    Unknown = 0
    Unplugged = 1
    Charging = 2
    Full = 3

将Int转换为Enum

只需将 int 传递给Enum

batteryStateInt = 2
curBattryState = BatteryState(batteryStateInt)
print("curBattryState=%s" % curBattryState)

可以达到您的期望Enum

curBattryState=BatteryState.Charging

额外

可以通过name

获取Enum字符串表达式
curBattryStateName = curBattryState.name
print("curBattryStateName=%s" % curBattryStateName)

可以预期:Charging