如何在Python中将int转换为Enum?
在使用新的枚举功能(通过backport enum34)时,我是在用python 2.7.6。
假设我有以下的定义,我该如何把一个整数转换成对应的枚举值呢?
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
我知道可以手动写一系列的if语句来进行转换,但有没有更简单的python方式来实现呢?基本上,我想要一个函数ConvertIntToFruit(int),它能返回一个枚举值。
我的使用场景是,我有一个csv文件,里面有很多记录,我想把每条记录读入一个对象中。文件中的一个字段是整数类型,表示一个枚举值。在我填充这个对象的时候,我想把文件中的这个整数字段转换成对象中的对应枚举值。
5 个回答
你可以这样获取枚举的名称字符串:
Fruit(5).name
你可以这样获取枚举的整数值:
Fruit(5).value
你可以这样获取枚举对象:
Fruit(5)
测试你的类:
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
像这样:
>>> Fruit(5)
<Fruit.Orange: 5>
>>> Fruit(5).name
'Orange'
>>> Fruit(5).value
5
>>> Fruit['Apple']
<Fruit.Apple: 4>
>>> Fruit['Apple'].value
4
>>> Fruit['Apple'].name
'Apple'
注意,当你想从整数转换时,你是像调用函数一样访问它
而当你想从字符串转换时,你是用方括号来访问它
class Status(IntEnum):
UPLOADED = 1
DOWNLOADED = 5
SEGMENTED = 10
DIRECTED = 15
READYTODEEP = 20
获取枚举类型;
statusId = 5
Status(statusId)
获取枚举的字符串值;
statusId = 5
print(Status(statusId).name)
我想要一个类似的东西,这样我就可以通过一个引用来访问值对的任意部分。下面是最基本的版本:
#!/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风格的做法是返回“None”,但我这个特定的应用直接使用文本。
我觉得简单来说,就是通过调用 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
你可以“调用”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>