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?

user1159517
quelle

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]
Marcin
quelle
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]
Ozgur
quelle
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')]
Jeff
quelle
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']
blueFast
quelle
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.

vlad-ardelean
quelle
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}
Meysam Azad
quelle
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

EliuX
quelle
-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)
Ali Shekari
quelle