Apa praktik umum untuk enum dengan Python? [duplikat]

Kemungkinan Duplikat:
Bagaimana saya bisa mewakili 'enum' dengan Python?

Apa praktik umum untuk enum dengan Python? Yaitu. bagaimana mereka direplikasi dengan Python?

public enum Materials
{
    Shaded,
    Shiny,
    Transparent,
    Matte
}

person Joan Venge    schedule 31.03.2009    source sumber
comment
Sekarang ada tipe Enum standar di Python 3.4. Baca posting ini: stackoverflow.com/questions/ 16653129/   -  person Javier    schedule 01.04.2014
comment
Berikut adalah PEP untuk tipe enum yang sekarang ada di Python: python.org/dev /peps/pep-0435   -  person shuttle87    schedule 27.07.2015
comment
Pertanyaan tertutup memiliki jawaban terbaik :)   -  person Apollys supports Monica    schedule 07.12.2019


Jawaban (4)


Saya telah melihat pola ini beberapa kali:

>>> class Enumeration(object):
        def __init__(self, names):  # or *names, with no .split()
            for number, name in enumerate(names.split()):
                setattr(self, name, number)

>>> foo = Enumeration("bar baz quux")
>>> foo.quux
2

Anda juga dapat menggunakan anggota kelas saja, meskipun Anda harus memberikan penomoran Anda sendiri:

>>> class Foo(object):
        bar  = 0
        baz  = 1
        quux = 2

>>> Foo.quux
2

Jika Anda mencari sesuatu yang lebih kuat (nilai renggang, pengecualian khusus enum, dll.), coba ini resep.

person Ben Blank    schedule 31.03.2009

Saya tidak tahu mengapa Enum tidak didukung secara asli oleh Python. Cara terbaik yang saya temukan untuk menirunya adalah dengan mengganti _ str _ dan _ eq _ sehingga Anda dapat membandingkannya dan saat Anda menggunakan print() Anda mendapatkan string alih-alih nilai numerik.

class enumSeason():
    Spring = 0
    Summer = 1
    Fall = 2
    Winter = 3
    def __init__(self, Type):
        self.value = Type
    def __str__(self):
        if self.value == enumSeason.Spring:
            return 'Spring'
        if self.value == enumSeason.Summer:
            return 'Summer'
        if self.value == enumSeason.Fall:
            return 'Fall'
        if self.value == enumSeason.Winter:
            return 'Winter'
    def __eq__(self,y):
       return self.value==y.value

Penggunaan:

>>> s = enumSeason(enumSeason.Spring)

>>> print(s)

Spring
person Spell    schedule 31.03.2009
comment
PEP354 memiliki pemberitahuan penolakan. Lihat python.org/dev/peps/pep-0354/#rejection -perhatikan - person Fred Larson; 01.04.2009
comment
Akan lebih cepat jika memiliki kamus kelas {Spring: 0, Summer:1, ...} dan menggunakan init untuk melakukan iterasi melalui entri dan menyetel atribut, karena str hanya bisa mencari nilainya daripada memberi kode secara manual untuk setiap kasus. - person Charles J. Daniels; 29.03.2015
comment
Lihat ini: python.org/dev/peps/pep-0435 - person shuttle87; 27.07.2015

Anda mungkin bisa menggunakan struktur warisan meskipun semakin sering saya memainkannya, saya merasa semakin kotor.

class AnimalEnum:
  @classmethod
  def verify(cls, other):
    return issubclass(other.__class__, cls)


class Dog(AnimalEnum):
  pass

def do_something(thing_that_should_be_an_enum):
  if not AnimalEnum.verify(thing_that_should_be_an_enum):
    raise OhGodWhy
person Trey Stout    schedule 31.03.2009

person    schedule
comment
Saya belum pernah melihatnya sebelumnya, bagus. - person Ben Blank; 01.04.2009
comment
Satu-satunya masalah adalah saya memerlukan item pertama menjadi 1. Apakah itu mungkin dilakukan dengan metode Anda? - person Joan Venge; 01.04.2009
comment
Dari semua metode yang pernah saya lihat, ini mungkin favorit saya. Sangat elegan! - person goldenratio; 01.04.2009
comment
@Joan Anda bisa melakukan _unused, Shaded, Shiny, Transparent, Matte = range(5) - person zekel; 09.12.2010
comment
Agak terlambat, tapi Anda juga bisa melakukan Shaded, Shiny, Transparent, Matte = range(1, 5) jika Anda tidak suka ada _unused di sana - person Davy8; 30.01.2011
comment
Anda juga tidak harus menggunakan rentang, memberikan nilai pada setiap variabel kelas satu per satu. - person bret; 14.06.2012
comment
Sayangnya, metode pembuatan enum ini tidak lengkap, karena enum tidak dapat diulangi, dan setiap nilai juga bukan tipe yang unik (misalnya hanya int). - person Gewthen; 10.06.2015
comment
@Gewthen Dalam banyak bahasa, enum hanyalah sebuah int. Bukankah itu lebih atau kurang diharapkan? Jika perlu, Anda dapat menerapkan iterator yang sesuai. - person Mads Y; 02.09.2015
comment
@MadsY Dalam bahasa lain, ini hanyalah gula sintaksis, sedangkan dalam bahasa lain (misalnya Python3) tidak. Memiliki tipe yang kuat untuk nilai-nilai Anda umumnya lebih baik dalam bahasa yang bertipe kuat, karena lebih banyak menggunakan bahasa tersebut. Jika hanya sekedar angka, lebih baik diingat saat melakukan debug atau melihat log. Saya lebih suka melihat Materials.shinny di log daripada 1 karena 1 memberi tahu saya lebih sedikit daripada Materials.shinny - person Gewthen; 17.10.2015
comment
Ini harus diperbarui untuk menambahkan bahwa enums menggunakan Python pada 3.4 - person SudoKid; 04.01.2017