Использование новой функции Enum (через бэкпорт enum34) с Python 2.7.6.
Учитывая следующее определение, как я могу преобразовать интервал в соответствующее Перечисление значений?
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
Я знаю, что могу вручить ремеслу серию операторов "if", чтобы сделать преобразование, но являюсь там легким pythonic способом преобразовать? В основном я хотел бы функциональный ConvertIntToFruit (интервал), который возвращает перечисление значений.
Мой вариант использования, у меня есть файл CSV записей, где я читаю каждую запись в объект. Одно из полей файла является целочисленным полем, которое представляет перечисление. Поскольку я заполняю объект, я хотел бы преобразовать то целочисленное поле из файла в соответствующее Перечисление значений в объекте.
Я думаю, что это находится в простых словах, должен преобразовать эти int
значение в Enum
путем вызова EnumType(int_value)
, после того доступа name
из эти Enum
объект:
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
Я хотел что-то подобное так, чтобы я мог получить доступ к любой части пары значения из единственной ссылки. Ванильная версия:
#!/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 способ сделать это должно было бы пасовать назад, "Ни один" кроме моего конкретного приложения не использует текст непосредственно.