在python中将枚举转换为int

时间:2011-05-19 14:57:28

标签: python enums

我有一个enum国籍:

class Nationality:
        Poland='PL'
        Germany='DE'
        France='FR'

如何以这种或类似的方式将此枚举转换为int:

position_of_enum = int(Nationality.Poland)  # here I want to get 0

我知道如果我有代码,我可以这样做:

counter=0
for member in dir(Nationality):
    if getattr(Nationality, member) == code:
        lookFor = member
        counter += 1
return counter

但我没有,这种方式对于python而言看起来太大了。我确信有一些更简单的东西。

8 个答案:

答案 0 :(得分:16)

请使用IntEnum

from enum import IntEnum

class loggertype(IntEnum):
    Info = 0
    Warning = 1
    Error = 2
    Fetal = 3

int(loggertype.Info)
0

答案 1 :(得分:13)

使用enum34 backportaenum 1 您可以创建专门的Enum

# using enum34
from enum import Enum

class Nationality(Enum):

    PL = 0, 'Poland'
    DE = 1, 'Germany'
    FR = 2, 'France'

    def __new__(cls, value, name):
        member = object.__new__(cls)
        member._value_ = value
        member.fullname = name
        return member

    def __int__(self):
        return self.value

并在使用中:

>>> print(Nationality.PL)
Nationality.PL
>>> print(int(Nationality.PL))
0
>>> print(Nationality.PL.fullname)
'Poland'

使用aenum 1

更容易编写上述内容
# using aenum
from aenum import Enum, MultiValue

class Nationality(Enum):
    _init_ = 'value fullname'
    _settings_ = MultiValue

    PL = 0, 'Poland'
    DE = 1, 'Germany'
    FR = 2, 'France'

    def __int__(self):
        return self.value

具有以下功能:

>>> Nationality('Poland')
<Nationality.PL: 0>

1 披露:我是Python stdlib Enumenum34 backportAdvanced Enumeration (aenum)图书馆的作者。

答案 2 :(得分:11)

有更好的(以及更多“Pythonic”)方式做你想做的事。

使用元组(或列表,如果需要修改),订单将被保留:

code_lookup = ('PL', 'DE', 'FR')
return code_lookup.index('PL') 

或者使用字典:

code_lookup = {'PL':0, 'FR':2, 'DE':3}
return code_lookup['PL']  

在我看来,后者更可取,因为它更具可读性和显性。

在你的具体情况下,namedtuple也可能有用,虽然它可能有点过分:

import collections
Nationalities = collections.namedtuple('Nationalities', 
                                       ['Poland', 'France', 'Germany'])
nat = Nationalities('PL', 'FR', 'DE')
print nat.Poland
print nat.index(nat.Germany)

答案 3 :(得分:5)

你做不到。 Python不存储类元素的顺序,dir()将以任何顺序返回它们。

从评论中看到你确实需要从字符串到整数的映射,实际上你应该这样做:

code_lookup = {
    'PL': ("Poland", 0), 
    'DE': ("Germany", 1), 
    'FR': ("France", 2), 
    ... 
}

答案 4 :(得分:4)

为什么不直接将值定义为数字而不是字符串:

class Nationality:
    POLAND = 0
    GERMANY = 1
    FRANCE = 2

如果您需要访问两个字母的名称,您只需提供一个映射它们的表格即可。 (或者用另一种方式映射的字典等)

答案 5 :(得分:4)

我见过类似的东西:

PL, FR, DE = range(3)

将它包装在一个类和 viola 中,你有一个枚举命名空间。

答案 6 :(得分:2)

from enum import Enum

class Nationality(Enum):
    Poland = 'PL'
    Germany = 'DE'
    France = 'FR'

    @classmethod
    def get_index(cls, type):
        return list(cls).index(type)

然后:

Nationality.get_index(Nationality.Poland)
0

答案 7 :(得分:1)

from enum import Enum

class Phone(Enum):
    APPLE = 1 #do not write comma (,)
    ANDROID = 2

#as int:
Phone.APPLE.value

如果使用逗号,则需要按索引访问元组:

class Phone(Enum):
    APPLE = 1, # note: there is comma (,)
    ANDROID = 2,

#as int:
Phone.APPLE.value[0]