[解決済み] 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
関連
-
python string splicing.join()とsplitting.split()の説明
-
[解決済み] データ型が理解できない
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python jiabaライブラリの使用方法について説明
-
python implement mysql add delete check change サンプルコード
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】終了コード -1073741515 (0xC0000135)でプロセス終了)
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み] Pythonのenumの常識とは?[重複している]。