@ user2340939 Yang mengembalikan daftar enum, bukan daftar nilai. Jika Anda setuju dengan itu, Anda sebaiknya menggunakanlist(Color)
endolith
1
Ini harus ditandai sebagai jawaban yang benar.
SKYFALL26
22
Untuk menggunakan Enum dengan segala jenis nilai, coba ini:
Diperbarui dengan beberapa peningkatan ... Terima kasih @ Jeff, berdasarkan tip Anda!
from enum importEnumclassColor(Enum):
RED =1
GREEN ='GREEN'
BLUE =('blue','#0000ff')@staticmethoddef list():return list(map(lambda c: c.value,Color))print(Color.list())
kelas enum.Enumadalah kelas yang memecahkan semua kebutuhan enumerasi Anda, jadi Anda hanya perlu mewarisi darinya, dan menambahkan bidang Anda sendiri. Kemudian sejak saat itu, yang perlu Anda lakukan hanyalah memanggil atributnya saja: name& value:
from enum importEnumclassLetter(Enum):
A =1
B =2
C =3print({i.name: i.value for i inLetter})# prints {'A': 1, 'B': 2, 'C': 3}
Jadi Enumada __members__dict. Solusi yang @ozgur usulkan benar-benar yang terbaik, tetapi Anda bisa melakukan ini, yang melakukan hal yang sama, dengan lebih banyak pekerjaan
[color.value for color_name, color in Color.__members__.items()]
Itu __members__ kamus bisa berguna jika Anda ingin memasukkan barang-barang secara dinamis di dalamnya ... dalam beberapa situasi gila.
[EDIT]
Rupanya__members__ bukan kamus, tetapi proxy peta. Yang berarti Anda tidak dapat dengan mudah menambahkan item ke dalamnya.
Namun Anda dapat melakukan hal-hal aneh seperti MyEnum.__dict__['_member_map_']['new_key'] = 'new_value', dan kemudian Anda dapat menggunakan kunci baru seperti MyEnum.new_key.... tapi ini hanya detail implementasi, dan tidak boleh dimainkan. Ilmu hitam dibayar dengan biaya perawatan yang sangat besar.
Hanya bilah sisi: dapatkah item ditambahkan __members__? Ini akan menjadi cara yang menarik untuk mengizinkan ekstensi sehingga menciptakan Enumanggota baru . ... btw, dipilih untuk membawa atribut baru ( ke saya ) ke tabel.
IAbstract
@Abstract: Tidak, itu tidak diizinkan. Jika seseorang menemukan cara untuk menambah / mengurangi anggota setelah Enum dibuat, mereka mungkin akan merusak Enum itu.
Ethan Furman
@IAbstract: Tambahkan anggota baru setelah faktanya biasanya bukan ide yang baik. Jika Anda benar-benar ingin, periksa jawaban ini .
Ethan Furman
1
Gunakan _member_names_untuk hasil yang mudah dan cepat jika hanya nama, yaitu
Color._member_names_
Juga, Anda memiliki _member_map_yang mengembalikan kamus elemen. Fungsi ini mengembalikan a collections.OrderedDict, jadi Anda harus Color._member_names_.items()dan Color._member_names_.values()untuk bermain dengannya. Misalnya
a = [(int(v), str(v)) for v in Color]
laluprint(a)
.[(color.value, color.name) for color in Color]
Anda dapat melakukan hal berikut:
sumber
list(Color)
Untuk menggunakan Enum dengan segala jenis nilai, coba ini:
Diperbarui dengan beberapa peningkatan ... Terima kasih @ Jeff, berdasarkan tip Anda!
Sebagai hasil:
sumber
@classmethod
perlu membuat instanceColor
kelas. Itu sebabnyastaticmethod
tampaknya pilihan yang tepat di sini.@classmethod
dan menggunakanreturn list(map(lambda c: c.value, cls))
sebagai gantinya.Berdasarkan jawaban oleh @Jeff, refactored untuk menggunakan
classmethod
sehingga Anda dapat menggunakan kembali kode yang sama untuk semua enum Anda:Menghasilkan:
sumber
kelas
enum.Enum
adalah kelas yang memecahkan semua kebutuhan enumerasi Anda, jadi Anda hanya perlu mewarisi darinya, dan menambahkan bidang Anda sendiri. Kemudian sejak saat itu, yang perlu Anda lakukan hanyalah memanggil atributnya saja:name
&value
:sumber
Jadi
Enum
ada__members__
dict. Solusi yang @ozgur usulkan benar-benar yang terbaik, tetapi Anda bisa melakukan ini, yang melakukan hal yang sama, dengan lebih banyak pekerjaan[color.value for color_name, color in Color.__members__.items()]
Itu
__members__
kamus bisa berguna jika Anda ingin memasukkan barang-barang secara dinamis di dalamnya ... dalam beberapa situasi gila.[EDIT] Rupanya
__members__
bukan kamus, tetapi proxy peta. Yang berarti Anda tidak dapat dengan mudah menambahkan item ke dalamnya.Namun Anda dapat melakukan hal-hal aneh seperti
MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
, dan kemudian Anda dapat menggunakan kunci baru sepertiMyEnum.new_key
.... tapi ini hanya detail implementasi, dan tidak boleh dimainkan. Ilmu hitam dibayar dengan biaya perawatan yang sangat besar.sumber
__members__
? Ini akan menjadi cara yang menarik untuk mengizinkan ekstensi sehingga menciptakanEnum
anggota baru . ... btw, dipilih untuk membawa atribut baru ( ke saya ) ke tabel.Gunakan
_member_names_
untuk hasil yang mudah dan cepat jika hanya nama, yaituJuga, Anda memiliki
_member_map_
yang mengembalikan kamus elemen. Fungsi ini mengembalikan acollections.OrderedDict
, jadi Anda harusColor._member_names_.items()
danColor._member_names_.values()
untuk bermain dengannya. Misalnyaakan mengembalikan semua nilai Color yang valid
sumber
Anda dapat menggunakan fungsi iter ():
sumber