使用新的Enum功能(通过backport enum34)和python 2.7.6。
根据以下定义,如何将int转换为相应的Enum值?
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
我知道我可以手工制作一系列if语句来进行转换,但有一种简单的pythonic转换方式吗?基本上,我想要一个返回枚举值的函数ConvertIntToFruit(int)。
我的用例是我有一个记录的csv文件,我正在将每条记录读入一个对象。其中一个文件字段是表示枚举的整数字段。当我填充对象时,我想将文件中的整数字段转换为对象中相应的Enum值。
答案 0 :(得分:95)
你打电话' Enum
类:
Fruit(5)
将5
变为Fruit.Orange
:
>>> from enum import Enum
>>> class Fruit(Enum):
... Apple = 4
... Orange = 5
... Pear = 6
...
>>> Fruit(5)
<Fruit.Orange: 5>
从文档的Programmatic access to enumeration members and their attributes部分:
有时访问枚举中的成员很有用 以编程方式(即
Color.red
不会做的情况,因为 在程序编写时不知道确切的颜色。Enum
允许这样做 访问:>>> Color(1) <Color.red: 1> >>> Color(3) <Color.blue: 3>
在相关说明中:要映射包含枚举成员的名称的字符串值,请使用订阅:
>>> s = 'Apple'
>>> Fruit[s]
<Fruit.Apple: 4>
答案 1 :(得分:0)
我认为简单地说就是通过调用int
将Enum
的值转换为EnumType(int_value)
,然后访问name
的{{1}}对象:
Enum
或作为功能:
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
答案 2 :(得分:-1)
我想要类似的东西,以便可以从单个引用访问值对的任何一部分。香草版本:
#!/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”,但是我的特定应用程序直接使用文本。