Enum4ライブラリを使用して、次のように列挙クラスを作成しています。
class Color(Enum):
RED = 1
BLUE = 2
[1, 2]
をリストとしてどこかに印刷したい。どうすればこれを達成できますか?
IntEnum を使用できます。
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
Intのリストを取得するには:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
次のことができます。
[e.value for e in Color]
任意のタイプの値でEnumを使用するには、これを試してください:
いくつかの改善を加えて更新しました... @Jeffに感謝します。
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())
その結果:
[1, 'GREEN', ('blue', '#0000ff')]
したがって、Enum
には__members__
dictがあります。 @ozgurが提案した解決策は本当に最高ですが、あなたはこれを行うことができます。
[color.value for color_name, color in Color.__members__.items()]
__members__
辞書は、何かを動的に挿入したい場合に便利です...ある種の異常な状況で。
[EDIT]どうやら__members__
は辞書ではなく、マッププロキシです。つまり、アイテムを簡単に追加することはできません。
ただし、MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
のような奇妙なことはできますが、MyEnum.new_key
....のような新しいキーを使用できますが、これは実装の詳細にすぎず、使用しないでください。ブラックマジックは巨額のメンテナンスコストで支払われます。
class enum.Enum
は、列挙の必要性をすべて解決するクラスです。したがって、それから継承し、独自のフィールドを追加するだけです。それから、あなたがする必要があるのは、その属性を呼び出すだけです: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}
@Jeffの回答に基づいて、classmethod
を使用するようにリファクタリングし、列挙型のすべてに同じコードを再利用できるようにしました。
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())
生産物:
['CREATE', 'STATUS', 'EXPAND', 'DELETE']
iter()関数を使用できます:
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
l=[]
for i in iter(Color):
l.append(i.value)
print(l)