我有一个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而言看起来太大了。我确信有一些更简单的东西。
答案 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
backport或aenum 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 Enum
,enum34
backport和Advanced 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]