如何在python中将int转换为枚举?

v9tzhpje  于 2023-03-11  发布在  Python
关注(0)|答案(4)|浏览(230)

在python 2.7.6中使用新的枚举特性(通过backport enum34)。
给定下面的定义,我如何将一个int转换为对应的Enum值?

from enum import Enum

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

我知道我可以手工制作一系列if语句来完成转换,但是有没有一种简单的Python方法来转换呢?基本上,我想要一个返回枚举值的函数ConvertIntToFruit(int)。
我的用例是我有一个记录的csv文件,我将其中的每一条记录读入一个对象。其中一个文件字段是一个表示枚举的整数字段。当我填充对象时,我希望将文件中的整数字段转换为对象中相应的枚举值。

nr9pn0ug

nr9pn0ug1#

您可以“调用”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>

在一份相关说明中:要Map包含枚举成员的 name 的字符串值,请使用subscription:

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

dzhpxtsq2#

我想简单来说就是通过调用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
kqlmhetl

kqlmhetl3#

class Status(IntEnum):
    UPLOADED = 1
    DOWNLOADED = 5
    SEGMENTED = 10    
    DIRECTED = 15
    READYTODEEP = 20

以获得枚举;

statusId = 5
Status(statusId)

获取枚举的字符串值;

statusId = 5
print(Status(statusId).name)
bvuwiixz

bvuwiixz4#

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

#!/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”,但我的特定应用程序直接使用文本。

相关问题