如何在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']
.
宾果游戏,非常棒!我在页面上搜索了convert
、coerce
和cast
,但没有找到任何内容。看起来魔法是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?的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中将unsigned char类型的int字符串转换为int