私はこの非常に単純な持ってArgumentParser
、オプションの位置引数と同じ宛先に定数を書き込み、オプションで、インスタンスを:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', action='store_const', dest='path', const='<all>')
parser.add_argument('path', nargs='?')
# Prints None instead of '<all>'
print(parser.parse_args(['-a']).path)
しかし、コマンドラインを解析するとどのような関係なく、['-a']
得られないNamespace
とのインスタンスをpath
その定数に設定します。代わりに、位置引数のデフォルトが使用されます。
何が私が間違っているのでしょうか?
私のユースケースは、ユーザがパス(パスの実際のリスト)を指定することができなければならないということです。現在の作業ディレクトリへのパスのデフォルト値のリスト。代わりに、デフォルトを使用する。しかし、-a
使用されるように、いくつかの構成されたルートディレクトリになるはずである、渡すことができます。引数パーサのこの部分のための完全なコードはこれです:
all_sentinel = object()
parser = argparse.ArgumentParser()
paths_group = parser.add_mutually_exclusive_group()
paths_group.add_argument('-a', action='store_const', dest='paths', const=all_sentinel)
paths_group.add_argument('paths', nargs='*', default=['.'])
位置は、nargs='?'
そのデフォルト(ここではいくつかの特別な処理がありますNone
)。
通常のデフォルト値は、解析の開始時に名前空間に割り当てられ、そのようなオプションなどの操作によって上書きされています。
値を満たすの空のリストがあるのでnargs
、その位置は常に「見」されます。むしろ割り当てよりも、[]
またはそれにはいくつかの他の「ブランク」、パーサはデフォルト値を割り当てます。「-a」で値セットを上書きする位置のデフォルトはそう。
nargs='*'
特別な取り扱いの同じ種類を取得します。
私は、あなたは、「-a」の前に別の位置引数を持っていた場合は、この効果を見ないであろうことと思われます。「?*」の位置は「-a」の前に処理され、その値を上書きしないことになります。
フラグが発生した場合Optionalsにのみ処理されます。Positionalsは関係なく、常にの、処理されますnargs
。「オプション」positionalsは、処理が、デフォルトのいくつかの余分な取扱いとされています。それらが処理されている場合でも、フラグ付き引数への相対は変えることができます。
それは私が私が詳細にコードを学び、ここやPythonのバグ/問題について多くの質問に答えてきたというだけの理由を知ってることを、いくつかのトリッキーな行動です。
共有することでdest
、多くの場合、作業を行いますが、それは、デザインよりも、デフォルトでは多くのです。これは、他の設計上の選択の結果です。 argparse
その点には約束を行うものではありません。それは信頼性がないのであれば、それを使用しないでください。