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?
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:
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]
a = [(int(v), str(v)) for v in Color]
ve sonra print(a)
.
[(color.value, color.name) for color in Color]
Aşağıdakileri yapabilirsiniz:
[e.value for e in Color]
list(Color)
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')]
@classmethod
örneğinin oluşturulması gerekecek Color
. Bu yüzden staticmethod
burada doğru seçim gibi görünüyor.
@classmethod
ve kullanabilirsiniz return list(map(lambda c: c.value, cls))
.
@ Jeff'in cevabına göre, numaralandırmalarınızdan classmethod
herhangi 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']
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}
Yani Enum
bir __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.
__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 .
_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
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)