2017-06-27 36 views
16

私はPythonでEnumの基底クラスが存在することを発見しました。私はそれがどのように役立つのか想像しています。文字列をpython enumと比較するには?

のは、私は交通信号の状態を定義しましょう:

from enum import Enum, auto 

class Signal(Enum): 
    red = auto() 
    green = auto() 
    orange = auto() 

はのは、私はインスタンスbrain_detected_colour = "red"のために、色の名前を表す文字列の形で、私のプログラムでは、いくつかのサブシステムからの情報を受信しましょう。

この文字列を信号光信号とどのように比較できますか? Signal.redが文字列ではないので

もちろん、brain_detected_colour is Signal.redは、Falseです。

Signal(brain_detected_colour) is Signal.redは、ValueError: 'red' is not a valid Signalで失敗します。

答えて

18

instance of an Enumは作成されません。 Signal(foo)の構文は、数値でEnumメンバーにアクセスするために使用されます。値は、auto()の場合には使用されません。

一つは角括弧を使用して、 dictの値にアクセスするようなものが access Enum membersに文字列を使用することができしかし

Signal[brain_detected_colour] is Signal.red 

別の可能性は、列挙体のnameに文字列を比較することであろう。

# Bad practice: 
brain_detected_colour is Signal.red.name 

しかし、ここでは、我々は、列挙型のメンバー間の同一性をテストしますが、文字列を比較するので、平等のテストを使用するより良い練習ですされていません。

# Better practice: 
brain_detected_colour == Signal.red.name 

(文字列間の同一性比較は、string interningのおかげでうまくいきました。 。おかげでそれの私を認識させるために@mwchaseと@Chris_Rands)

列挙型を作成するときにさらに別の可能性は、明示的に自分の名前とメンバー値を設定するために、次のようになります。

class Signal(Enum): 
    red = "red" 
    green = "green" 
    orange = "orange" 

(メソッドのthis answerを参照してください。 )

次に、Signal(brain_detected_colour) is Signal.redが有効です。

+6

brain_detected_colourで 'is'を使用すると、Signal.red.name'は危険です。 '=='を使うほうが良いでしょう。 – mwchase

+0

@mwchase答えを編集して説明を追加できるように、理由を説明できますか? – bli

+4

あなたは実際にオブジェクトのアイデンティティを比較する必要がない限り、文字列のインターンリング、暗い実装の詳細http://guilload.com/python-string-interning/に決して 'is'を使用しないでください。 –

5

auto section of the docs である(その値として列挙メンバーの名前を返すauto()有することが可能である:

>>> class AutoName(Enum): 
...  def _generate_next_value_(name, start, count, last_values): 
...   return name 
... 

>>> class Ordinal(AutoName): 
...  NORTH = auto() 
...  SOUTH = auto() 
...  EAST = auto() 
...  WEST = auto() 
... 

>>> list(Ordinal) 
[<Ordinal.NORTH: 'NORTH'>, <Ordinal.SOUTH: 'SOUTH'>, <Ordinal.EAST: 'EAST'>, <Ordinal.WEST: 'WEST'>] 

これはバージョンのPython 3.6を必要とし、またはaenum 2.0 (aenumは2.7のPythonsで動作します)。

開示:私はPython stdlib Enumの著者、enum34 backport、およびAdvanced Enumeration (aenum)ライブラリです。

関連する問題