在Python中将枚举转换为整数
我有一个叫做 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'
上面的代码用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标准库中的Enum
、enum34
这个库和高级枚举库(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)