Saya bertanya-tanya apa cara yang benar untuk mengubah (deserializing) string ke kelas Enum Python. Sepertinya getattr(YourEnumType, str)
melakukan pekerjaan, tapi saya tidak yakin apakah itu cukup aman.
Untuk lebih spesifik, saya ingin mengonversi 'debug'
string ke objek Enum seperti ini:
class BuildType(Enum):
debug = 200
release = 400
python
string
serialization
enums
type-conversion
Vladius
sumber
sumber
Build.get('illegal', Build.debug)
?Enum
tidak datang dengan.get()
metode, tetapi Anda dapat menambahkan satu sesuai kebutuhan, atau hanya membuatEnum
kelas dasar dan selalu mewarisi dari itu.Build('debug')
Build('debug')
. Konstruktor kelas harus mengambil nilai , yaitu200
atau400
dalam contoh ini. Untuk memberikan nama, Anda harus menggunakan tanda kurung siku, seperti yang sudah dijawab oleh jawabannya.Alternatif lain (terutama berguna jika string Anda tidak peta 1-1 untuk kasus enum Anda) adalah menambahkan
staticmethod
untuk AndaEnum
, misalnya:Maka Anda bisa melakukannya
question_type = QuestionType.from_str('singleSelect')
sumber
Atau Anda perlu mengonversi string menjadi Enum yang dikenal ?
Atau:
sumber
debug
string menjadi enum seperti:python class BuildType(Enum): debug = 200 release = 400
__dict__
sama dengangetattr
? Saya khawatir tentang tabrakan nama dengan atribut Python internal ....getattr
. Saya tidak melihat alasan untuk tabrakan nama. Anda tidak dapat menetapkan kata kunci sebagai bidang kelas.Solusi mirip Java saya untuk masalah ini. Semoga ini bisa membantu seseorang ...
sumber
Peningkatan jawaban @rogueleaderr:
sumber
Saya hanya ingin memberi tahu ini tidak bekerja di python 3.6
Anda harus memberikan data sebagai tuple seperti ini
EDIT: Ini ternyata salah. Penghargaan kepada komentator karena menunjukkan kesalahan saya
sumber
,
(koma) setelah setiap elemen (seolah-olah elemen itu daftar) maka itu memperlakukan setiap elemen sebagai tupel. (Yaitua = 'aaa',
sebenarnya sama dengana = ('aaa',)
),
belakang setiap baris sambil mendefinisikan enum yang mengubah nilai menjadi tuple entah bagaimana