1. ホーム
  2. python

[解決済み] Pythonで'Enum'を表現するにはどうしたらいいですか?

2022-03-17 02:38:36

質問

私は主にC#の開発者ですが、現在はPythonでプロジェクトを進めています。

PythonでEnumに相当するものを表現するにはどうしたらよいでしょうか?

どのように解決するのですか?

列挙 で説明されているように、Python 3.4で追加されました。 PEP 435 . また 3.3、3.2、3.1、2.7、2.6、2.5、および 2.4 にバックポートされました。 をpypiに追加しました。

より高度なEnumのテクニックは aenum ライブラリ (2.7、3.3+、作者は enum34 . コードはpy2とpy3の間で完全に互換性があるわけではありません。 __order__ python 2の場合 ).

  • 使用するには enum34 を実行します。 $ pip install enum34
  • 使用方法 aenum を実行します。 $ pip install aenum

インストール enum (数字なし)は、全く異なる互換性のないバージョンをインストールします。


from enum import Enum     # for enum34, or the stdlib version
# from aenum import Enum  # for the aenum version
Animal = Enum('Animal', 'ant bee cat dog')

Animal.ant  # returns <Animal.ant: 1>
Animal['ant']  # returns <Animal.ant: 1> (string lookup)
Animal.ant.name  # returns 'ant' (inverse lookup)

またはそれに準ずるもの。

class Animal(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4


以前のバージョンでは、enumを実現する一つの方法として。

def enum(**enums):
    return type('Enum', (), enums)

というように使われます。

>>> Numbers = enum(ONE=1, TWO=2, THREE='three')
>>> Numbers.ONE
1
>>> Numbers.TWO
2
>>> Numbers.THREE
'three'

また、こんな感じで簡単に自動列挙に対応できます。

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)

というように使用します。

>>> Numbers = enum('ZERO', 'ONE', 'TWO')
>>> Numbers.ZERO
0
>>> Numbers.ONE
1

値を名前に戻すためのサポートは、この方法で追加することができます。

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.iteritems())
    enums['reverse_mapping'] = reverse
    return type('Enum', (), enums)

これはその名前を持つものをすべて上書きしますが、列挙を出力でレンダリングするのに便利です。これは KeyError は、逆マッピングが存在しない場合 最初の例で

>>> Numbers.reverse_mapping['three']
'THREE'


MyPy を使用している場合、quot;enum" を表現する別の方法として、次のようなものがあります。 typing.Literal .

例えば

from typing import Literal #python >=3.8
from typing_extensions import Literal #python 2.7, 3.4-3.7


Animal = Literal['ant', 'bee', 'cat', 'dog']

def hello_animal(animal: Animal):
    print(f"hello {animal}")

hello_animal('rock') # error
hello_animal('bee') # passes