web-dev-qa-db-ja.com

python enumクラスからすべての値を取得する方法は?

Enum4ライブラリを使用して、次のように列挙クラスを作成しています。

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

[1, 2]をリストとしてどこかに印刷したい。どうすればこれを達成できますか?

95
user1159517

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]
28
Marcin

次のことができます。

[e.value for e in Color]
284
ozgur

任意のタイプの値で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')]
16
Jeff

したがって、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....のような新しいキーを使用できますが、これは実装の詳細にすぎず、使用しないでください。ブラックマジックは巨額のメンテナンスコストで支払われます。

5
vlad-ardelean

class enum.Enumは、列挙の必要性をすべて解決するクラスです。したがって、それから継承し、独自のフィールドを追加するだけです。それから、あなたがする必要があるのは、その属性を呼び出すだけです:namevalue

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}
4
Meysam Azad

@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']
1
dangonfast

iter()関数を使用できます:

from enum import IntEnum

class Color(IntEnum):
   RED = 1
   BLUE = 2
l=[]
for i in iter(Color):
    l.append(i.value)
print(l)
0
Ali Shekari