在Python中将枚举转换为整数

70 投票
11 回答
96660 浏览
提问于 2025-04-16 17:58

我有一个叫做 Nationality 的枚举类型:

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

我想把这个枚举转换成整数,像这样或者类似的方式:

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 里看起来太复杂了。我相信有更简单的方法。

11 个回答

40

使用enum34这个库或者aenum1,你可以创建一个特别的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'

上面的代码用aenum1写起来会更简单:

# 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标准库中的Enumenum34这个库高级枚举库(aenum的作者。

144

请使用 IntEnum

from enum import IntEnum

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

int(loggertype.Info)
0
13

有更好的(也更“符合Python风格”)方法来实现你想要的功能。

你可以使用元组(如果需要修改的话可以用列表),这样顺序会被保留:

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)

撰写回答