Как преобразовать интервал в Перечисление в Python?

Использование новой функции Enum (через бэкпорт enum34) с Python 2.7.6.

Учитывая следующее определение, как я могу преобразовать интервал в соответствующее Перечисление значений?

from enum import Enum

class Fruit(Enum):
    Apple = 4
    Orange = 5
    Pear = 6

Я знаю, что могу вручить ремеслу серию операторов "if", чтобы сделать преобразование, но являюсь там легким pythonic способом преобразовать? В основном я хотел бы функциональный ConvertIntToFruit (интервал), который возвращает перечисление значений.

Мой вариант использования, у меня есть файл CSV записей, где я читаю каждую запись в объект. Одно из полей файла является целочисленным полем, которое представляет перечисление. Поскольку я заполняю объект, я хотел бы преобразовать то целочисленное поле из файла в соответствующее Перечисление значений в объекте.

61
задан 30 May 2014 в 13:50

2 ответа

Я думаю, что это находится в простых словах, должен преобразовать эти 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
1
ответ дан 31 October 2019 в 15:54

Я хотел что-то подобное так, чтобы я мог получить доступ к любой части пары значения из единственной ссылки. Ванильная версия:

#!/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 способ сделать это должно было бы пасовать назад, "Ни один" кроме моего конкретного приложения не использует текст непосредственно.

-1
ответ дан 31 October 2019 в 15:54

Другие вопросы по тегам:

Похожие вопросы: