Qual è il modo più idiomatico per creare una raccolta di enum.Enum in Python?

0

Ho un Enum in Python che assomiglia a questo:

import enum

class Color(enum.Enum):
    red = 'red'
    blue = 'blue'
    yellow = 'yellow'
    puce = 'puce'
    chartreuse = 'chartreuse'

E io voglio avere qualcosa come:

primary_colors = (Color.red, Color.blue, Color.yellow)

Ma naturalmente se provo a inserire questa riga nell'enumerazione, Color non è definita. E se uso (red, blue, yellow) allora diventa solo una tupla di stringhe. E non posso estendere Enum, quindi non posso fare qualcosa del tipo:

class PrimaryColor(enum.Enum):
    red = 'red'
    yellow = 'yellow'
    green = 'green'

class Color(enum.Enum, PrimaryColor):
    puce = 'puce'
    chartreuse = 'chartreuse'

Quindi cos'è un modo idiomatico in cui posso dire di avere questa raccolta di colori primari che è un sottoinsieme di Color ? Mi sono limitato a qualcosa di simile?

primary_colors = (Color.red, Color.yellow, Color.blue)
    
posta Wayne Werner 14.09.2017 - 20:52
fonte

1 risposta

6

Una delle cose da tenere a mente su enum.Enum è che qualsiasi non- descriptor l'attributo viene convertito in un membro Enum - quindi property e funzioni / metodi non sono (convertiti). Ciò significa che puoi fare qualcosa come:

class Color(enum.Enum):
    red = 'red'
    blue = 'blue'
    yellow = 'yellow'
    puce = 'puce'
    chartreuse = 'chartreuse'

    @property
    def primary_colors(self):
        return self.red, self.blue, self.yellow

Questo ti permette di fare:

>>> Color.primary_colors
(Color.red, Color.blue, Color.yellow)

Se lo si desidera, è possibile aggiungere anche una proprietà is_primary() :

    @property
    def is_primary(self):
        return self in self.primary_colors

E poi, se ottieni un membro Color , fai:

if some_Color_member.is_primary:
    do_something()
    
risposta data 14.09.2017 - 21:57
fonte

Leggi altre domande sui tag