파이썬에서 int를 Enum으로 변환하는 방법은 무엇입니까?


99

파이썬 2.7.6과 함께 새로운 Enum 기능 ( 백 포트 enum34 를 통해 ) 사용.

다음 정의가 주어지면 int를 해당 Enum 값으로 어떻게 변환 할 수 있습니까?

from enum import Enum

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

변환을 수행하기 위해 일련의 if 문을 직접 만들 수 있다는 것을 알고 있지만 쉽게 변환 할 수있는 파이썬적인 방법이 있습니까? 기본적으로 열거 형 값을 반환하는 ConvertIntToFruit (int) 함수를 원합니다.

내 사용 사례는 각 레코드를 객체로 읽는 CSV 파일이 있다는 것입니다. 파일 필드 중 하나는 열거를 나타내는 정수 필드입니다. 개체를 채울 때 파일의 해당 정수 필드를 개체의 해당 Enum 값으로 변환하고 싶습니다.

답변:


168

Enum수업에 '전화'합니다 .

Fruit(5)

차례에 5Fruit.Orange:

>>> from enum import Enum
>>> class Fruit(Enum):
...     Apple = 4
...     Orange = 5
...     Pear = 6
... 
>>> Fruit(5)
<Fruit.Orange: 5>

문서의 열거 형 멤버 및 해당 속성 섹션에 대한 프로그래밍 방식 액세스에서 :

때로는 프로그래밍 방식으로 열거 형 멤버에 액세스하는 것이 유용합니다 (예 : Color.red프로그램 작성시 정확한 색상을 알 수 없기 때문에 그렇지 않은 상황 ). Enum이러한 액세스를 허용합니다.

>>> Color(1)
<Color.red: 1>
>>> Color(3)
<Color.blue: 3>

관련 참고 : 열거 형 멤버 의 이름 이 포함 된 문자열 값을 매핑 하려면 subscription을 사용합니다.

>>> s = 'Apple'
>>> Fruit[s]
<Fruit.Apple: 4>

문서를 다시 읽으면서 감사합니다. 첫 번째 훑어보기에서 명확하지 않았습니다. 또한 문자열을 사용하여 열거 형 값이 문자열 일 때도 작동하는지 확인하고 임의의 개체 값을 가정합니다.
사용자

매우 훌륭하므로 전환은 가치를 기준으로합니다. 열거 형 목록을 통해 필터링하고 이름 속성과 일치하는 목록 이해를 통하지 않는 이름에 대한 아날로그가 있습니까?
jxramos

4
@jxramos는 내 대답의 문서 링크를 따르며 명시 적으로 다룹니다. 항목 액세스 사용 : Fruit['Orange'].
Martijn Pieters

빙고, 아주 멋져요! 나는의 페이지를 검색 convert, coerce그리고 cast아무것도하지만 공격하지 않았다. 마법이 된 것 같습니다 access enum members by name, use item access. Perfecto, 감사합니다.이 구문으로 코드를 정리하겠습니다.
jxramos

더 멋진 것은 "foobar" in Fruit.__members__멤버십을 테스트하는 것과 같은 것을 사용할 Fruit.get( 'foobar', Fruit.Orange )수 있으며 기본 Enum 맛을 얻기 위해 사용할 수도 있다는 것입니다. 내 코드는 이전에 배치 한 이러한 모든 액세서리 조회 스캐 폴딩을 제거하는 것이 훨씬 더 간단 해 보입니다.
jxramos

1

나는 간단한 단어에하면 변환하는 것입니다 생각 int에 값을 Enum호출하여 EnumType(int_value)대한 액세스 후, nameEnum목적 :

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

단일 참조에서 값 쌍의 일부에 액세스 할 수 있도록 비슷한 것을 원했습니다. 바닐라 버전 :

#!/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]))

올바르게 사용되지 않으면 예외 생성을 방지하고 대신 오류 표시를 다시 전달합니다. 이 작업을 수행하는 좀 더 파이썬적인 방법은 "None"을 다시 전달하는 것이지만 내 특정 응용 프로그램은 텍스트를 직접 사용합니다.


Enum 인스턴스 에서 __int____str__메서드를 정의하지 않는 이유는 무엇 입니까?
Tim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.