2016-07-04 2 views
0

私は、定数のような何らかの種類の定義済みのシンボルを使うことができるところで、Pythonが頻繁に文字列を使用することに気付きました。例えば、​​からコードのサンプルを言い換えする:定義されたシンボル(定数)よりも文字列が優先されるのはなぜですか?

import argparse 

parser = argparse.ArgumentParser(description='Process some integers.') 
parser.add_argument('--sum', dest='accumulate', action='store_const', 
        const=sum, default=max, 
        help='sum the integers (default: find the max)') 

ではなく、開発者が、例えば、一定のようなシンボルを定義しなかった理由ストリング'store_const'の使用を必要としますArgumentParser.STORE_CONST

コードエディタはモジュールでそれらを簡単に見ることができ、コード補完のための提案として使用することができます。また、文字列のタイプミスによってエラーが発生することはありませんが、定義されたシンボルのタイプミスはおそらく発生します。私はこの方法でPythonの文字列を使った例をいくつか見てきましたが、JavaやPHPのような他の言語ではあまり一般的ではありません。

+2

おそらく、逃亡者またはGuido自身。それ以外では、あなたはただ意見を得るつもりです。 –

+1

定数名を間違えた場合、 'enum'のような構文はJavaやC++のような言語でコンパイルエラーを出しますが、Pythonで既成の定数を提供しても、実行時にエラーが発生します。そのコードパス。 IOW:ランタイムチェックされた文字列とランタイム定義のシンボルのランタイムルックアップを比較しているので、大きな違いはありません。 –

+2

(これは、Pythonの標準ライブラリでさえも、これは主に好みの問題であるように見えることに注意してください。 're'モジュールを調べると、すべてのregexpフラグは' re'モジュールのトップレベル定数です)。 –

答えて

1

多くのライブラリは、「定数」を使用するのです...それはまた次の名前付き定数

SUPPRESS = '==SUPPRESS==' 

OPTIONAL = '?' 
ZERO_OR_MORE = '*' 
ONE_OR_MORE = '+' 
PARSER = 'A...' 
REMAINDER = '...' 
_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' 

別のオプションは次のようになりを提供していますが、同じように簡単にargparse._StoreConstAction

に渡すことができ

argparse含みますあなたを悩ませているすべての魔法の数字や文字列を含むあなた自身の定数クラスを書くこと

+1

実際には、さまざまな 'Action'サブクラスがリストされています:https://hg.python.org/cpython/file /3.5/Lib/argparse.py#l1233ただし、それらはパブリックインターフェイスから明示的に除外されています。 – jonrsharpe

+0

だから、 'argparse import _StoreConstAction'を実行することはできませんが、それでも' import argparse; argparse._St ... 'でオートコンプリートを与えます –

関連する問題