2015-01-08 16 views
8

今日、多くのライブラリが、列挙型変数よりも文字列をパラメータとして使用するほうが望ましいように思えました。関数のパラメータとしての列挙型vs文字列

人々は、以前は列挙型を使用していました。 dateutil.rrule.FR金曜日は、文字列を使用する方向にシフトしているようです(例:'FRI')。 例えばをsearchsorted

numpyの(またはそのことについてパンダ)で同じ

は、(例えば側面=を「左」、または側面=「右」)よりもむしろ定義列挙ストリングの使用します。誤解を避けるために、Pythonの3.4の前に、これは簡単なよう列挙型として実装されている可能性が:

class SIDE: 
    RIGHT = 0 
    LEFT = 1 

そして列挙型変数の利点は明白です:あなたは、エラーを出さずにそれらを間違えないことができ、 IDEなどの適切なサポートを提供します。

なぜ、列挙型を使用するのではなく、文字列を使用するのはなぜですか?これにより、プログラムはユーザーのエラーにさらされやすくなりますか?列挙型のオーバーヘッドを作成するようなものではありません。だからいつ、なぜこのパラダイムシフトが起こったのですか?

答えて

2

IMHO味の問題です。このスタイルのような一部の人:

def searchsorted(a, v, side='left', sorter=None): 
    ... 
    assert side in ('left', 'right'), "Invalid side '{}'".format(side) 
    ... 

numpy.searchsorted(a, v, side='right') 

はい、あなたはside='foo'searchsortedを呼び出す場合は、実行時にAssertionError道後に得ることができます - しかし、少なくともバグがトレースバックを探して見つけることがとても簡単になります。

他の人が(あなたが強調表示の利点を)好むかもしれないが:

numpy.searchsorted(a, v, side=numpy.CONSTANTS.SIDE.RIGHT) 

私はめったに使われない定数は、名前空間の嫌なものの価値はないと思うので、私は最初のを好みます。あなたは反対するかもしれません、そして、人々は他の懸念のためにいずれかの側に揃えるかもしれません。

あなたが本当に気にしている場合、何もあなた自身の「列挙型」を定義することができなくない:

class SIDE(object): 
    RIGHT = 'right' 
    LEFT = 'left' 

numpy.searchsorted(a, v, side=SIDE.RIGHT) 

私はそれは価値がないと思うが、再び、それは好みの問題です。

[更新]

ステファンが公正ポイント作っ:できるだけ早く必要性が、そのような列挙型の値を変更する必要が生じ見上げると、多くの場所で文字列を交換しても、私のないよう

をあなたは、文字列'right'を検索し、偽陽性の多くを取得する必要があります例を使用して -

:-)の楽しみのアイデアは、私は、これは名前付きパラメータなしの言語にすることができますどのように痛みを伴う見ることができます。 Pythonでは、side='right'を検索して絞り込むことができます。

すでに外部Cライブラリのように定義済みのenum/constのセットを持っているインターフェイスを扱っている場合、是非とも既存の規約を模倣してください。

3

特に、複数の開発者がいる大規模なシステムでは、列挙型はより安全です。

できるだけ早く必要が

最も重要な基準の私見:-)楽しみの私の考えではありません検索し、多くの場所で文字列を置換し、そのような列挙型の値を変更する必要が生じて使用量は次のとおりです。モジュールやパッケージでの使用のために文字列がうまくいるようですが、公開APIでは列挙型が好きです。

1

私はデバッグの理由から文字列を好みます。私はまた、値が文字列である「列挙型」を好き

side='BUY', opt_type='PUT', order_type='FILL_OR_KILL' 

side=1, opt_type=0, order_type=6 

のようなオブジェクトを比較:

class Side(object): 
    BUY = 'BUY' 
    SELL = 'SELL' 
    SHORT = 'SHORT' 
1

厳密に列挙型を持っていないのPythonを話す - 少なくともそれをかv3.4以前ではありませんでした。

https://docs.python.org/3/library/enum.html

私はあなたの例をプログラマが定義した定数と考えることを好みます。

​​には、1組の定数が文字列値を持っています。コードでは定数名が使用されますが、ユーザーは頻繁に文字列を使用します。

e.g. argparse.ZERO_OR_MORE = '*' 
arg.parse.OPTIONAL = '?' 

numpy古いサードパーティのパッケージの1(numericのような、少なくともそのルーツである)です。文字列値は列挙型よりも一般的です。実際には、(あなたが定義したように)任意のenumを考えるのは難しいです。