Saya menggunakan perpustakaan Enum4 untuk membuat kelas enum sebagai berikut:
class Color(Enum):
RED = 1
BLUE = 2
Saya ingin mencetak [1, 2]sebagai daftar di suatu tempat. Bagaimana saya bisa mencapai ini?
Saya menggunakan perpustakaan Enum4 untuk membuat kelas enum sebagai berikut:
class Color(Enum):
RED = 1
BLUE = 2
Saya ingin mencetak [1, 2]sebagai daftar di suatu tempat. Bagaimana saya bisa mencapai ini?
Jawaban:
Anda dapat menggunakan IntEnum :
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
Untuk mendapatkan daftar int:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
a = [(int(v), str(v)) for v in Color]lalu print(a).
[(color.value, color.name) for color in Color]
Untuk menggunakan Enum dengan segala jenis nilai, coba ini:
Diperbarui dengan beberapa peningkatan ... Terima kasih @ Jeff, berdasarkan tip Anda!
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 'GREEN'
BLUE = ('blue', '#0000ff')
@staticmethod
def list():
return list(map(lambda c: c.value, Color))
print(Color.list())
Sebagai hasil:
[1, 'GREEN', ('blue', '#0000ff')]
@classmethodperlu membuat instance Colorkelas. Itu sebabnya staticmethodtampaknya pilihan yang tepat di sini.
@classmethoddan menggunakan return list(map(lambda c: c.value, cls))sebagai gantinya.
Berdasarkan jawaban oleh @Jeff, refactored untuk menggunakan classmethodsehingga Anda dapat menggunakan kembali kode yang sama untuk semua enum Anda:
from enum import Enum
class ExtendedEnum(Enum):
@classmethod
def list(cls):
return list(map(lambda c: c.value, cls))
class OperationType(ExtendedEnum):
CREATE = 'CREATE'
STATUS = 'STATUS'
EXPAND = 'EXPAND'
DELETE = 'DELETE'
print(OperationType.list())
Menghasilkan:
['CREATE', 'STATUS', 'EXPAND', 'DELETE']
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 import Enum
class Letter(Enum):
A = 1
B = 2
C = 3
print({i.name: i.value for i in Letter})
# 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.
__members__? Ini akan menjadi cara yang menarik untuk mengizinkan ekstensi sehingga menciptakan Enumanggota baru . ... btw, dipilih untuk membawa atribut baru ( ke saya ) ke tabel.
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
return list(map(lambda x: x.value, Color._member_map_.values()))
akan mengembalikan semua nilai Color yang valid
Anda dapat menggunakan fungsi iter ():
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
l=[]
for i in iter(Color):
l.append(i.value)
print(l)