Korzystanie z nowej funkcji Enum (przez backport enum34 ) w Pythonie 2.7.6.
Biorąc pod uwagę następującą definicję, w jaki sposób mogę przekonwertować wartość typu int na odpowiednią wartość Enum?
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
Wiem, że mogę ręcznie stworzyć serię instrukcji if, aby wykonać konwersję, ale czy istnieje łatwy sposób konwersji w języku Python? Zasadniczo chciałbym funkcję ConvertIntToFruit (int), która zwraca wartość wyliczenia.
Mój przypadek użycia jest taki, że mam plik rekordów csv, w którym wczytuję każdy rekord do obiektu. Jedno z pól pliku jest polem całkowitoliczbowym, które reprezentuje wyliczenie. Ponieważ wypełniam obiekt, chciałbym przekonwertować to pole liczby całkowitej z pliku na odpowiednią wartość Enum w obiekcie.
źródło
Fruit['Orange']
.convert
,coerce
icast
, ale nie nic trafić. Wygląda na to, że była magiaaccess enum members by name, use item access
. Perfecto, wielkie dzięki, zamierzam wyczyścić mój kod za pomocą tej składni."foobar" in Fruit.__members__
test członkostwa, a nawet zdjąć,Fruit.get( 'foobar', Fruit.Orange )
aby uzyskać domyślny smak Enum. Mój kod wygląda na znacznie bardziej uproszczony, usuwając wszystkie te rusztowania wyszukiwania akcesoriów, które opisałem wcześniej.Myślę, że w prostych słowach należy przekonwertować
int
wartość naEnum
wywołanieEnumType(int_value)
, a następnie uzyskać dostępname
doEnum
obiektu: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
Lub jako funkcja:
def convert_int_to_fruit(int_value): try: my_fruit_from_int = Fruit(int_value) return my_fruit_from_int.name except: return None
źródło
Chciałem czegoś podobnego, aby móc uzyskać dostęp do dowolnej części pary wartości z jednego odniesienia. Wersja waniliowa:
#!/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))
Niepowodzenie zgłasza wyjątek, zgodnie z oczekiwaniami.
Bardziej solidna wersja:
#!/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]))
Gdy nie jest używany poprawnie, pozwala to uniknąć tworzenia wyjątku i zamiast tego przekazuje z powrotem wskazanie błędu. Bardziej Pythonowym sposobem na zrobienie tego byłoby przekazanie z powrotem „Brak”, ale moja konkretna aplikacja używa tego tekstu bezpośrednio.
źródło
__int__
i__str__
w instancji Enum?