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

172 投票
5 回答
108534 浏览
提问于 2025-04-18 08:02

在使用新的枚举功能(通过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 个回答

1

你可以这样获取枚举的名称字符串

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'

注意,当你想从整数转换时,你是像调用函数一样访问它

而当你想从字符串转换时,你是用方括号来访问它

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

获取枚举类型;

statusId = 5
Status(statusId)

获取枚举的字符串值;

statusId = 5
print(Status(statusId).name)
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”,但我这个特定的应用直接使用文本。

3

我觉得简单来说,就是通过调用 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
293

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

撰写回答