问题:如何在python中将int转换为Enum?
在python 2.7.6中使用新的Enum功能(通过backport enum34)。
给定以下定义,如何将int转换为相应的Enum值?
from enum import Enum
class Fruit(Enum):
    Apple = 4
    Orange = 5
    Pear = 6
我知道我可以手工制作一系列的if语句来进行转换,但是有没有简单的pythonic转换方法?基本上,我想要一个返回枚举值的函数ConvertIntToFruit(int)。
我的用例是我有一个记录的csv文件,在其中我将每个记录读入一个对象。文件字段之一是代表枚举的整数字段。在填充对象时,我想将文件中的整数字段转换为对象中对应的Enum值。
回答 0
您“打电话”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>
在相关说明中:要映射包含枚举成员名称的字符串值,请使用subscription:
>>> s = 'Apple'
>>> Fruit[s]
<Fruit.Apple: 4>
回答 1
我认为这是简单的话是对转换int价值为Enum通过调用EnumType(int_value),访问后name的的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
或作为功能:
def convert_int_to_fruit(int_value):
    try:
        my_fruit_from_int = Fruit(int_value)
        return my_fruit_from_int.name
    except:
        return None
回答 2
我想要类似的东西,以便可以从单个引用访问值对的任何一部分。香草版本:
#!/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”,但是我的特定应用程序直接使用文本。
	声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
