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

Posted

技术标签:

【中文标题】如何在python中将int转换为Enum?【英文标题】:How to convert int to Enum in python? 【发布时间】:2014-07-20 00:56:17 【问题描述】:

在 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 值。

【问题讨论】:

【参考方案1】:

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

在相关说明中:要映射包含枚举成员的 name 的字符串值,请使用订阅:

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

【讨论】:

谢谢,因为我正在重新阅读文档。我第一次浏览时并不清楚。另外我只是尝试使用一个字符串,很高兴看到它在枚举值也是一个字符串时也可以工作,并且我假设任何任意对象值。 非常好,所以转化是按价值计算的。除了通过列表推导过滤枚举列表并在名称属性上进行匹配之外,是否有类似的名称? @jxramos 确实按照我的答案中的文档链接进行操作,那里明确介绍了它。使用物品权限:Fruit['Orange']. 宾果游戏,非常棒!我在页面上搜索了convertcoercecast,但没有找到任何内容。看起来魔法是access enum members by name, use item access。 Perfecto,非常感谢,将使用此语法清理我的代码。 更酷的是我可以使用 "foobar" in Fruit.__members__ 之类的东西来测试成员资格,甚至可以使用 Fruit.get( 'foobar', Fruit.Orange ) 来获得默认的 Enum 风格。我的代码看起来更加简化了,删除了我之前放置的所有这些附件查找脚手架。【参考方案2】:

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

【讨论】:

【参考方案3】:

我想要类似的东西,以便我可以从单个引用访问值对的任何部分。原版:

#!/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]))

如果使用不当,这会避免创建异常,而是会返回故障指示。一种更 Pythonic 的方法是传回“无”,但我的特定应用程序直接使用文本。

【讨论】:

为什么不在 Enum 实例上定义 __int____str__ 方法?

以上是关于如何在python中将int转换为Enum?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 int 转换为枚举?

如何在python中将unsigned char类型的int字符串转换为int

如何在python中将单引号字符串转换为数字[重复]

在 Python 中将字符串转换为枚举

在 Python 中将 Excel 列类型从 Int 转换为 String

在 python 中将 HEX 转换为无符号 INT16 [重复]