Menggunakan fitur Enum baru (via backport enum34 ) dengan python 2.7.6.
Diberikan definisi berikut, bagaimana cara mengonversi int ke nilai Enum yang sesuai?
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
Saya tahu saya dapat membuat serangkaian pernyataan if untuk melakukan konversi tetapi apakah ada cara pythonic yang mudah untuk mengonversi? Pada dasarnya, saya ingin fungsi ConvertIntToFruit (int) yang mengembalikan nilai enum.
Kasus penggunaan saya adalah saya memiliki file csv rekaman tempat saya membaca setiap rekaman menjadi suatu objek. Salah satu bidang file adalah bidang integer yang mewakili pencacahan. Saat saya mengisi objek, saya ingin mengubah bidang integer dari file menjadi nilai Enum yang sesuai di objek.
sumber
Fruit['Orange']
.convert
,coerce
dancast
tapi tidak memukul apa-apa. Sepertinya keajaiban ituaccess enum members by name, use item access
. Perfecto, terima kasih banyak, akan membersihkan kode saya dengan sintaks ini."foobar" in Fruit.__members__
untuk menguji keanggotaan dan bahkan melakukanFruit.get( 'foobar', Fruit.Orange )
untuk mendapatkan rasa Enum default itu. Kode saya terlihat jauh lebih sederhana dengan menghapus semua perancah pencarian aksesori yang saya buat sebelumnya.Saya pikir itu dalam kata-kata sederhana adalah untuk mengkonversi
int
nilai keEnum
dengan meneleponEnumType(int_value)
, setelah akses bahwaname
dariEnum
objek: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
Atau sebagai fungsi:
def convert_int_to_fruit(int_value): try: my_fruit_from_int = Fruit(int_value) return my_fruit_from_int.name except: return None
sumber
Saya menginginkan sesuatu yang serupa sehingga saya dapat mengakses salah satu bagian dari pasangan nilai dari satu referensi. Versi vanilla:
#!/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))
Kegagalan memunculkan pengecualian seperti yang diharapkan.
Versi yang lebih kuat:
#!/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]))
Jika tidak digunakan dengan benar, ini menghindari pembuatan pengecualian dan, sebagai gantinya, mengembalikan indikasi kesalahan. Cara yang lebih Pythonic untuk melakukan ini adalah dengan mengirimkan kembali "Tidak ada" tetapi aplikasi khusus saya menggunakan teks secara langsung.
sumber
__int__
dan__str__
metode pada instance Enum saja?