enum - mendapatkan nilai enum pada konversi string

108

Saya telah mengikuti enum yang ditentukan

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D.x)

sekarang nilai yang dicetak adalah

D.x

sebagai gantinya saya ingin nilai enum dicetak

1

Apa yang dapat dilakukan untuk mencapai fungsi ini?

Vaibhav Mishra
sumber
1
Saya harus mengklarifikasi parameter akses, saya tahu hal Dxvalue, yang saya inginkan adalah konversi string Dx untuk mengembalikan nilai, maaf jika pertanyaan tidak membuat kondisinya jelas.
Vaibhav Mishra

Jawaban:

188

Anda sedang mencetak objek enum . Gunakan .valueatribut jika Anda hanya ingin mencetaknya:

print(D.x.value)

Lihat akses program ke anggota pencacahan dan atribut mereka bagian :

Jika Anda memiliki anggota enum dan membutuhkan nama atau nilainya:

>>>
>>> member = Color.red
>>> member.name
'red'
>>> member.value
1

Anda dapat menambahkan __str__metode ke enum Anda, jika yang Anda inginkan hanyalah memberikan representasi string khusus:

class D(Enum):
    def __str__(self):
        return str(self.value)

    x = 1
    y = 2

Demo:

>>> from enum import Enum
>>> class D(Enum):
...     def __str__(self):
...         return str(self.value)
...     x = 1
...     y = 2
... 
>>> D.x
<D.x: 1>
>>> print(D.x)
1
Martijn Pieters
sumber
Ketika saya membandingkannya dengan nilai integer, itu kembali sebagai objek. Ex: if D.x == 10: .... Pendekatan apa yang harus saya ambil untuk bilangan bulat?
alper
@alper: persis sama; D.xadalah objek enum, D.x.valueadalah nilai integer. Jika Anda harus memiliki nilai enum bertindak seperti bilangan bulat, gunakan IntEnumtipe , di mana setiap elemen adalah subkelas intdan IntEnumD.x == 10akan berfungsi.
Martijn Pieters
Saya telah menambahkan def __eq__(self, other): return int(self.value) == otherdan def __int__(self): return int(self.value)tapi tetap saya rasa saya harus menggunakan .valuekasus-kasus ketika saya tidak menggunakan pembanding
alper
@alper: __eq__implementasi itu tidak bekerja ketika otherada nilai enum lain; D.x == D.y, di mana D.x.value == D.y.valuebenar, akan gagal misalnya. Sepertinya Anda ingin menggunakan, IntEnumbukan di Enumsana.
Martijn Pieters
7

Saya menerapkan akses menggunakan berikut ini

class D(Enum):
    x = 1
    y = 2

    def __str__(self):
        return '%s' % self.value

sekarang saya bisa melakukannya

print(D.x)untuk mendapatkan 1hasilnya.

Anda juga dapat menggunakan self.namejika Anda ingin mencetak xdaripada 1.

Vaibhav Mishra
sumber
2
Mengapa pemformatan string dan self._value_? return str(self.value)lebih mudah.
Martijn Pieters
1
Saya baru saja melihat sumbernya dan beginilah penerapannya, namun Anda benar dan self.valuelebih bersih.
Vaibhav Mishra
3
Atribut garis bawah tunggal bersifat internal ke kelas enum yang dihasilkan; sebaiknya tetap gunakan atribut yang didokumentasikan (yang kebetulan merupakan deskriptor khusus sehingga Anda masih dapat menggunakan valuesebagai nama pada tipe enum Anda).
Martijn Pieters
@MartijnPieters setuju
Vaibhav Mishra
0

Saya menemukan halaman ini ketika mencari untuk mengakses Enummenggunakan string. Saya tahu ini bukan yang ditanyakan dalam pertanyaan khusus ini, tetapi judulnya memang 'menyarankan'.

Untuk mendapatkan Enum menggunakan String, Anda dapat melakukan hal berikut:

from enum import Enum


class D(Enum):
    x = 1
    y = 2


print(D["x"])  # <D.x: 1>
Kerwin Sneijders
sumber