長い間、私は、Python関数にフラグを渡す最も良い方法が何であるか把握しようとしています。最も簡単な方法のようなものです:Python:関数にフラグを渡す
def func(data, flag1, flag2, flag3):
...
func(my_data, True, False, True)
これは、単語「true」または「false」があなたに設定されているもののフラグについて何も伝えないので、本当に素晴らしく、簡潔な、しかし、読み非常に難しいです、そしてあなた左から始まる議論を注意深く数えなければならない。
def func(data, flag1=False, flag2=False, flag3=False):
...
func(my_data, flag1=True, flag3=True)
が、これは冗長なの一種である、「真」以来まったく意味を運ばない:あなたはそれらのキーワード引数を作ることができます。私はそれをリストとして渡すことができます。
func(mydata, ['flag1', 'flag3'])
または
func(mydata, [func.flag1, func.flag3])
しかし、最初はフラグとして文字列を使用して、かなり汚い感じている、第二は、まだ多少の繰り返しです。最小限の冗長性と冗長性を備えた関数にフラグを渡すために
func(my_data, flag1, flag3)
:理想的には私のような何かを言いたいです。このようなPythonで何かをする方法はありますか?
EDIT: 一緒に行くことになったI:グローバル「ENUM」のを使用するのではなく、コンパイル時(文字列を渡し対)をチェック、ノー名前空間の汚染(:主に述べた理由のため
func(mydata, flagA=1, flagB=1)
)と最小限の定型文(= 1または= 0は2文字のみです。= 5または6は= Trueまたは= Falseです)。また、非常に簡単にフラグのデフォルト値を設定します:はるかに明確かつに** kwargスタイルのフラグを抽出し、デフォルト値を割り当てるためにフープを介してジャンプするよりもはるかに簡単です
def func(data, flagA=1, flagB=0, flagC=1):
...
を。フラグは基本的には静的にチェックされ、非常にクリア/クリーンに書き込まれます。今、私は最後の2つの文字を剃り落とすことができた場合にのみ... *引数付き
は、なぜあなたは/が最初の場所でのフラグを渡す必要がありたいですか?おそらくあなたはあなたのインターフェースを考え直すべきです... –
フラグは、データ構造内で動作する関数の将来の動作を制御するデータ構造内のboolを設定するために使用されます。これは完全に非OOのアプローチですが、私は簡単に選択しました。たとえ私がOOスタイルにしても、行動の変化はかなり微妙で、扱うクラスのファミリー全体を作成する価値がないかもしれません。 –
おそらく、値を含む(より単純な)データ構造を渡すことができますか?フラグのセット、またはboolにフラグ名をマップする 'dict' ... –