10

Pythonで列挙型を実装する方法についていくつか質問がありました。ほとんどのソリューションは、最終的に次のようなものとほぼ同等になります。

class Animal:
    DOG=1
    CAT=2

他の人は列挙型を構築するより複雑な方法を提案していますが、すべてが言われ、行われると、最終的にはこの例のように見える傾向があります。

JavaとC#での経験に基づいて、このようなイディオムのさまざまな使用法を考えることができます。しかし、それはあまりPythonicではないようです。実際、Pythonに列挙型がない理由を誰かが尋ねるたびに、Pythonのような言語でコンパイル時の型の安全性を強制しようとする理由がないことについて、定型の応答で少しうめき声を上げる傾向があるようです。または、列挙型を必要とするデザインがPythonの悪臭である方法。

私の質問は、Pythonで列挙型を実装する方法ではなく、一般的に、Pythonの方法で列挙型に役立つ問題の解決策に人々がどのようにアプローチするかです。言い換えると、Java / C#ソリューションをPythonに移植せずに、可能な値の離散セットを持つデータ型を持つことに役立つ問題をどのように解決しますか。

4

4 に答える 4

4

PEP 435が受け入れられ、列挙型パッケージがEnumクラスやIntEnumなどの他の派生物とともに標準ライブラリに追加されました。これは、Python 3.4以降、デザインで列挙型を使用する「pythonic」方法がこのパッケージを使用することを意味します。次のようになります。

>>> from enum import Enum
>>> class Color(Enum):
...    red = 1
...    green = 2
...    blue = 3

>>> print(Color.red)
Color.red

>>> print(Color.red.name)
red

>>>> for color in Color:
....     print(color)
Color.red
Color.green
Color.blue

この設計の重要な機能は、キーが意味をなさない場合に比較を拒否できること(他の回答で提案されている文字列キーとは異なり)、キー値とは無関係にキーをきれいに印刷できること、およびキー値に特別な値を与えることです。ユーザーがEnumクラスの不正なキーを使用しようとした場合に明示的で理解可能なエラーをスローするプロパティに加えて、Enumサブクラスでメソッドを定義することによるプロパティ。

于 2013-05-10T14:21:26.883 に答える
3

Python文字列は不変であるため(そしてPythonは必要に応じて文字列をインターンします)、一連のものに数値列挙型を使用することに特別な利点はありません。代わりに、文字列のfrozensetまたはtupleを使用できます(順序を気にするかどうかによって異なります)。

一方、気になるのが名前空間である場合、クラスの属性を作成することは問題なく機能します。

コメントで述べたように、ステートマシンの実装のようなものを探しているなら、ファーストクラスの関数があなたの友達です。

于 2012-10-10T02:28:30.700 に答える
2

C#またはJavaのバックグラウンドを持っていないので、列挙型に対するこの関心をまだよく理解していません。

私が理解していることから、必要な定数を設定ファイルに入れ、必要に応じてインポートすることで、おそらくdjangoスタイルにフォールバックするでしょう。

settings.py/animals.py

DOG = 1
CAT = 2

他のファイル:

from animals import CAT, DOG

あるいは...

settings.py

ANIMALS = { "DOG": 1, "CAT": 2}

他のファイル:

from settings import ANIMALS

my_animal = "FROG"
if my_animal not in ANIMALS.keys():
    print "new species discovered!"
于 2012-10-10T02:22:35.307 に答える
-1

私はC#の列挙型を信じていません。ステートマシンの場合、戦略パターンがあります。オブジェクトの状態を見て、何をすべきかを決めるのではなく。オブジェクト自体で何をするかのロジックをカプセル化します。

これはPythonの自然なアプローチであり、列挙型の導入は悪いコードを奨励するだけです。

于 2014-09-30T22:24:48.137 に答える