Wie bekomme ich alle Werte aus der Python-Enum-Klasse?


139

Ich verwende die Enum4-Bibliothek, um eine Enum-Klasse wie folgt zu erstellen:

class Color(Enum):
    RED = 1
    BLUE = 2

Ich möchte [1, 2]irgendwo als Liste drucken . Wie kann ich das erreichen?

Antworten:


48

Sie können IntEnum verwenden :

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2


print(int(Color.RED))   # prints 1

So erhalten Sie eine Liste der Ints:

enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]

Sie verwenden einen Drittanbieter. Aber es sagt auch, dass es Intenum hat
— Marcin

Wie drucke ich wie [(1, 'ROT'), (2, 'BLAU')]
— user1159517

Was ist damit: a = [(int(v), str(v)) for v in Color]und dann print(a).
— Marcin

33
Wie wäre es damit:[(color.value, color.name) for color in Color]
— Vlad-Ardelean

2
@ vlad-ardeleans Kommentar ist der beste und pythonischste. Das ist eine idiomatische Verwendung des Enum-Typs, elegant und hervorragend lesbar
— Dusktreader

428

Sie können Folgendes tun:

[e.value for e in Color]

1
@ user2340939 Das gibt die Liste der Aufzählungen zurück, nicht die Liste der Werte. Wenn Sie damit einverstanden sind, können Sie auchlist(Color)
— endolith

21

Um Enum mit einem beliebigen Wert zu verwenden, versuchen Sie
Folgendes : Mit einigen Verbesserungen aktualisiert ... Vielen Dank an @Jeff, durch Ihren Tipp!

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())

Als Ergebnis:

[1, 'GREEN', ('blue', '#0000ff')]

6
Ich würde @classmethod anstelle von @ staticmethod
— ISONecroMAn

1
@ISONecroMAn Ich denke, es @classmethodwäre erforderlich, eine Instanz der ColorKlasse zu erstellen . Deshalb staticmethodscheint hier die richtige Wahl zu sein.
— Leonid Dashko

@LeonidDashko überhaupt nicht. Siehe meine Antwort.
— blueFast

@LeonidDashko @dangoonfast ist korrekt. Sie können stattdessen verwenden @classmethodund verwenden return list(map(lambda c: c.value, cls)).
— Riptyde4

17

Basierend auf der Antwort von @Jeff, überarbeitet, um a zu verwenden, classmethoddamit Sie denselben Code für jede Ihrer Aufzählungen wiederverwenden können:

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())

Produziert:

['CREATE', 'STATUS', 'EXPAND', 'DELETE']

6

Das Enumhat also ein __members__Diktat. Die von @ozgur vorgeschlagene Lösung ist wirklich die beste, aber Sie können dies, was dasselbe tut, mit mehr Arbeit tun

[color.value for color_name, color in Color.__members__.items()]

Das __members__Wörterbuch könnte nützlich sein, wenn Sie Dinge dynamisch einfügen möchten ... in einer verrückten Situation.

[EDIT] Anscheinend __members__handelt es sich nicht um ein Wörterbuch, sondern um einen Map-Proxy. Das heißt, Sie können nicht einfach Elemente hinzufügen.

Sie können jedoch seltsame Dinge wie tun MyEnum.__dict__['_member_map_']['new_key'] = 'new_value', und dann können Sie den neuen Schlüssel verwenden wie MyEnum.new_key... aber dies ist nur ein Implementierungsdetail und sollte nicht damit gespielt werden. Schwarze Magie wird mit enormen Wartungskosten bezahlt.


Nur eine Seitenleiste: Können Elemente hinzugefügt werden __members__? Es wäre eine interessante Möglichkeit, Erweiterungen zuzulassen und dadurch neue EnumMitglieder zu erstellen . ... übrigens, positiv bewertet, weil ich ein neues ( für mich ) Attribut in die Tabelle aufgenommen habe.
— IAbstract

@IAbstract: Nein, das ist nicht erlaubt. Wenn jemand einen Weg findet, Mitglieder hinzuzufügen / zu entfernen, nachdem die Aufzählung erstellt wurde, wird er diese Aufzählung wahrscheinlich brechen.
— Ethan Furman

@IAbstract: Neue Mitglieder hinzufügen, nachdem die Tatsache normalerweise keine gute Idee ist. Wenn Sie wirklich wollen, lesen Sie diese Antwort .
— Ethan Furman

6

Klasse enum.Enumist eine Klasse, die alle Ihre Aufzählungsanforderungen löst. Sie müssen also nur davon erben und Ihre eigenen Felder hinzufügen. Von da an müssen Sie nur noch die Attribute aufrufen: 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}

1

Verwenden Sie _member_names_für ein schnelles einfaches Ergebnis, wenn es nur die Namen sind, dh

Color._member_names_

Außerdem haben Sie _member_map_ein geordnetes Wörterbuch der Elemente. Diese Funktion gibt a zurück collections.OrderedDict, also haben Sie Color._member_names_.items()und Color._member_names_.values()zum Spielen. Z.B

return list(map(lambda x: x.value, Color._member_map_.values()))

gibt alle gültigen Werte von Color zurück


-1

Sie können die iter () -Funktion verwenden:

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2
l=[]
for i in iter(Color):
    l.append(i.value)
print(l)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.