如何在 python 中将 int 转换为 Enum?

在 python2.7.6中使用新的 Enum 特性(通过 后端口枚举34)。

给定以下定义,如何将 int 转换为相应的 Enum 值?

from enum import Enum


class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6

我知道我可以手工制作一系列的 if 语句来进行转换,但是有没有简单的 Python 转换方法呢?基本上,我希望有一个函数 ConvertIntToFruit (int)返回一个枚举值。

我的用例是我有一个 csv 文件的记录,我读取每个记录到一个对象。其中一个文件字段是表示枚举的整数字段。在填充对象时,我希望将该整数字段从文件转换为对象中相应的 Enum 值。

80332 次浏览

你称之为 Enum类:

Fruit(5)

5变成 Fruit.Orange:

>>> from enum import Enum
>>> class Fruit(Enum):
...     Apple = 4
...     Orange = 5
...     Pear = 6
...
>>> Fruit(5)
<Fruit.Orange: 5>

摘自文件的 以编程方式访问枚举成员及其属性部分:

有时访问枚举中的成员是有用的 编程方式(即 Color.red无法执行的情况,因为 在程序编写时不知道确切的颜色)。 Enum允许这样 进入:

>>> Color(1)
<Color.red: 1>
>>> Color(3)
<Color.blue: 3>

在相关说明中: 要映射包含枚举成员的 姓名的字符串值,请使用订阅:

>>> s = 'Apple'
>>> Fruit[s]
<Fruit.Apple: 4>

我认为简单的说就是通过调用 EnumType(int_value)int值转换成 Enum,然后访问 Enum对象的 name:

my_fruit_from_int = Fruit(5) #convert to int
fruit_name = my_fruit_from_int.name #get the name
print(fruit_name) #Orange will be printed here

或者作为一种功能:

def convert_int_to_fruit(int_value):
try:
my_fruit_from_int = Fruit(int_value)
return my_fruit_from_int.name
except:
return None

我想要一些类似的东西,这样我就可以从一个引用访问值对的任何一部分。香草版:

#!/usr/bin/env python3




from enum import IntEnum




class EnumDemo(IntEnum):
ENUM_ZERO       = 0
ENUM_ONE        = 1
ENUM_TWO        = 2
ENUM_THREE      = 3
ENUM_INVALID    = 4




#endclass.




print('Passes')
print('1) %d'%(EnumDemo['ENUM_TWO']))
print('2) %s'%(EnumDemo['ENUM_TWO']))
print('3) %s'%(EnumDemo.ENUM_TWO.name))
print('4) %d'%(EnumDemo.ENUM_TWO))
print()




print('Fails')
print('1) %d'%(EnumDemo.ENUM_TWOa))

正如预期的那样,失败会抛出一个异常。

更健壮的版本:

#!/usr/bin/env python3




class EnumDemo():




enumeration =   (
'ENUM_ZERO',    # 0.
'ENUM_ONE',     # 1.
'ENUM_TWO',     # 2.
'ENUM_THREE',   # 3.
'ENUM_INVALID'  # 4.
)




def name(self, val):
try:


name = self.enumeration[val]
except IndexError:


# Always return last tuple.
name = self.enumeration[len(self.enumeration) - 1]


return name




def number(self, val):
try:


index = self.enumeration.index(val)
except (TypeError, ValueError):


# Always return last tuple.
index = (len(self.enumeration) - 1)


return index




#endclass.




print('Passes')
print('1) %d'%(EnumDemo().number('ENUM_TWO')))
print('2) %s'%(EnumDemo().number('ENUM_TWO')))
print('3) %s'%(EnumDemo().name(1)))
print('4) %s'%(EnumDemo().enumeration[1]))
print()
print('Fails')
print('1) %d'%(EnumDemo().number('ENUM_THREEa')))
print('2) %s'%(EnumDemo().number('ENUM_THREEa')))
print('3) %s'%(EnumDemo().name(11)))
print('4) %s'%(EnumDemo().enumeration[-1]))

如果使用不当,这将避免创建异常,而是传回错误指示。一个更加 Python 化的方法是返回“ Nothing”,但是我的特定应用程序直接使用文本。