Menggunakan Python Enum kelas, apakah ada cara untuk menguji apakah sebuah Enum, berisi spesifik int nilai tanpa menggunakan try/catch?
Dengan kelas berikut:
from enum import Enum
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
Bagaimana saya dapat menguji nilai 6 (kembali benar), atau nilai 7 (kembali palsu)?
perhatikan bahwa Enum
memiliki anggota yang disebut _value2member_map_
(yang tercatat dan dapat diubah/dihapus di masa depan versi python):
print(Fruit._value2member_map_)
# {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
anda dapat menguji apakah suatu nilai berada dalam Enum
terhadap peta ini:
5 in Fruit._value2member_map_ # True
7 in Fruit._value2member_map_ # False
jika anda tidak ingin bergantung pada fitur ini ini adalah sebuah alternatif:
values = [item.value for item in Fruit] # [4, 5, 6]
atau (mungkin lebih baik): menggunakan set
; dalam
operator akan lebih efisien:
values = set(item.value for item in Fruit) # {4, 5, 6}
kemudian tes dengan
5 in values # True
7 in values # False
has_value
untuk kelas andaanda kemudian bisa menambahkan ini sebagai metode untuk kelas anda:
class Fruit(Enum):
Apple = 4
Orange = 5
Pear = 6
@classmethod
def has_value(cls, value):
return value in cls._value2member_map_
print(Fruit.has_value(5)) # True
print(Fruit.has_value(7)) # False
jika anda ingin menguji untuk nama-nama (dan bukan nilai) saya akan menggunakan _member_names_
:
'Apple' in Fruit._member_names_ # True
'Mango' in Fruit._member_names_ # False
Anda bisa menggunakan Enum.__anggota__
- memerintahkan kamus pemetaan nama-nama untuk anggota:
In [12]: 'Apple' in Fruit.__members__
Out[12]: True
In [13]: 'Grape' in Fruit.__members__
Out[13]: False
Hanya memeriksa apakah itu's di Enum. _value2member_map_
In[15]: Fruit._value2member_map_
Out[15]: {4: <Fruit.Apple: 4>, 5: <Fruit.Orange: 5>, 6: <Fruit.Pear: 6>}
In[16]: 6 in Fruit._value2member_map_
Out[16]: True
In[17]: 7 in Fruit._value2member_map_
Out[17]: False
Don't.
Jika anda menggunakan Enum, anda dapat menguji untuk enum dengan
if isinstance(key, Fruit):
Tapi jika tidak, mencoba.. adalah pythonic cara untuk menguji enum. Memang, untuk setiap istirahat di duck-typing paradigma.
Yang benar, dan pythonic, cara pengujian untuk int di IntEnum adalah untuk mencobanya dan untuk menangkap ValueError jika ada's sebuah kegagalan.
Banyak solusi yang diusulkan di atas secara aktif usang dan akan dianulir oleh 3.8 ( "DeprecationWarning: menggunakan non-Enums dalam penahanan pemeriksaan akan menaikkan TypeError di Python 3.8" )
Jika anda benar-benar tertarik dalam menjaga kode yang modern, maka anda hanya dapat menggunakan
if key in Fruit:
Sebuah EAFP versi menjawab:
python coba: Buah(val) mengembalikan True kecuali ValueError: kembali Palsu
Jika anda ingin mendapatkan enum kalau benda itu adalah nilai yang valid dan meningkatkan ValueError
jika tidak, anda hanya dapat menggunakan Buah(val)