如何在python中将int
强制转换为enum
?
答案 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
batteryStateInt = 2
curBattryState = BatteryState(batteryStateInt)
print("curBattryState=%s" % curBattryState)
可以达到您的期望Enum
:
curBattryState=BatteryState.Charging
可以通过name
curBattryStateName = curBattryState.name
print("curBattryStateName=%s" % curBattryStateName)
可以预期:Charging