Python enum sınıfından tüm değerler nasıl alınır?


141

Aşağıdaki gibi bir enum sınıfı oluşturmak için Enum4 kitaplığını kullanıyorum:

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

[1, 2]Bir yere liste olarak yazdırmak istiyorum. Bunu nasıl başarabilirim?

Yanıtlar:


49

IntEnum'u kullanabilirsiniz :

from enum import IntEnum

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


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

Girişlerin listesini almak için:

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

Üçüncü taraf birini kullanıyorsunuz. Ama aynı zamanda yoğun olduğunu söylüyor
Marcin

[(1, 'KIRMIZI'), (2, 'MAVİ')] şeklinde nasıl
yazdırırım

Şuna ne dersin: a = [(int(v), str(v)) for v in Color]ve sonra print(a).
Marcin

34
[(color.value, color.name) for color in Color]
Şuna

2
@ vlad-ardelean'ın yorumu en iyi ve en pitoniktir. Bu, Enum türünün deyimsel kullanımı, zarif ve fazlasıyla okunabilir
dusktreader

435

Aşağıdakileri yapabilirsiniz:

[e.value for e in Color]

1
@ user2340939 Bu, değerler listesini değil, numaralandırmaların listesini döndürür. list(Color)
Bunda sorun

1
Bu doğru cevap olarak işaretlenmelidir.
SKYFALL

22


Enum'u herhangi bir değerle kullanmak için şunu deneyin: Bazı iyileştirmelerle güncellendi ... Teşekkürler @Jeff, ipucunuzdan!

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

Sonuç olarak:

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

6
@ Staticmethod yerine @classmethod
ISONecroMAn

1
@ISONecroMAn Sanırım sınıf @classmethodörneğinin oluşturulması gerekecek Color. Bu yüzden staticmethodburada doğru seçim gibi görünüyor.
Leonid Dashko

@LeonidDashko hiç de değil. Cevabımı gör.
blueFast

@LeonidDashko @dangoonfast doğru. Bunun yerine kullanabilir @classmethodve kullanabilirsiniz return list(map(lambda c: c.value, cls)).
Riptyde4

18

@ Jeff'in cevabına göre, numaralandırmalarınızdan classmethodherhangi biri için aynı kodu yeniden kullanabilmeniz için a kullanmak üzere yeniden düzenlenmiştir:

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

üretir:

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

7

class enum.Enum, tüm numaralandırma ihtiyaçlarınızı çözen bir sınıftır, bu nedenle sadece ondan miras almanız ve kendi alanlarınızı eklemeniz gerekir. O andan itibaren, yapmanız gereken tek şey yalnızca özelliklerini çağırmaktır: 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}

6

Yani Enumbir __members__emir var. @ Ozgur'un önerdiği çözüm gerçekten en iyisidir, ancak bunu aynı şeyi yapan, daha fazla işle yapabilirsiniz.

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

__members__Bazı çılgın durumda ... dinamik İçinde şeyler eklemek istiyorsa Sözlük işe yarayabilir.

[DÜZENLE] Görünüşe göre __members__bir sözlük değil, bir harita vekili. Bu, ona kolayca öğe ekleyemeyeceğiniz anlamına gelir.

Yine de tuhaf şeyler MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'yapabilirsiniz ve sonra yeni anahtarı MyEnum.new_key.... gibi kullanabilirsiniz ama bu sadece bir uygulama detayıdır ve oynanmamalıdır. Kara büyü, büyük bakım maliyetleri ile ödenir.


Sadece bir kenar çubuğu: öğeler eklenebilir __members__mi? Uzantılara izin vererek yeni Enumüyeler oluşturmanın ilginç bir yolu olurdu . ... btw, masaya yeni ( bana ) bir özellik getirdiği için olumlu oy verildi .
IAbstract

@IAbstract: Hayır, buna izin verilmiyor. Birisi, Enum oluşturulduktan sonra üye eklemenin / çıkarmanın bir yolunu bulursa, muhtemelen o Enum'u bozacaktır.
Ethan Furman

@IAbstract: Genelde iyi bir fikir olmadığından sonra yeni üyeler ekleyin. Gerçekten istiyorsan, bu yanıta bak .
Ethan Furman

1

_member_names_Yalnızca isimlerse, hızlı ve kolay bir sonuç için kullanın , ör.

Color._member_names_

Ayrıca, _member_map_öğelerin sıralı bir sözlüğünü döndüren var . Bu işlev a döndürür collections.OrderedDict, böylece Color._member_names_.items()ve Color._member_names_.values()oynamanız gerekir . Örneğin

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

tüm geçerli Color değerlerini döndürür


-1

iter () işlevini kullanabilirsiniz:

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2
l=[]
for i in iter(Color):
    l.append(i.value)
print(l)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.