In [355]: config_args = {'my_argument': 'value from configuration file'}
In [356]: parser = argparse.ArgumentParser()
add_argument
はAction
オブジェクトを作成し、返します。のは、そのオブジェクトへの参照を保存し、それを見てみましょう:そのdefault
はNone
、store
のデフォルトのデフォルトであることを
In [357]: a1 = parser.add_argument('--my-argument', dest='my_argument', required
...: =True)
In [358]: a1
Out[358]: _StoreAction(option_strings=['--my-argument'], dest='my_argument', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
注意してください。 required
もTrue
に設定されています。
set_defaults
はa1.default
値を変更:
In [359]: parser.set_defaults(**config_args)
In [360]: a1
Out[360]: _StoreAction(option_strings=['--my-argument'], dest='my_argument', nargs=None, const=None, default='value from configuration file', type=None, choices=None, help=None, metavar=None)
set_defaults
も(subparsersためのドキュメントに示されている)の引数に表示されないdest
の値を設定するために使用することができます。
引数なしで実行すると、処理が必要なためエラーが発生します。デフォルトの存在はそれを無効にするものではありません。我々はFalse
からrequired
属性を変更した場合
In [361]: parser.parse_args([])
usage: ipython3 [-h] --my-argument MY_ARGUMENT
ipython3: error: the following arguments are required: --my-argument
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
(a1
は、その属性が、限度内で、変更することができる。すなわち、a1.default
含むオブジェクトです)。
In [362]: a1.required
Out[362]: True
In [363]: a1.required=False
In [364]: parser.parse_args([])
Out[364]: Namespace(my_argument='value from configuration file')
設定値が表示されます。コマンドラインの値で上書きすることができます。
またnamespace
パラメータにデフォルト値を提供することができます。
In [365]: ns = argparse.Namespace(my_argument='foo')
In [366]: parser.parse_args([], namespace=ns)
Out[366]: Namespace(my_argument='foo')
このfoo
値が優先され、そのアクションのデフォルトまたはset_defaults
値が使用されていません。
https://bugs.python.org/issue29670argparse: does not respect required args pre-populated into namespace
このバグ/問題では、ユーザーはrequired
テストを上書きするns
に値が存在することを望んでいました。つまり、コマンドラインで値が提供されたかのように、このns
が動作するようにします。私の結論は、変更するのは簡単なことではないということです。現在のparse_args
構造では、required
のようなものの修正やバイパステストはできません。
好きなテストをしたい場合は、default=None
のままにしておき、解析後に独自のテストを行うことをおすすめします。
if args.my_argument is None:
args.my_argument = 'default from config'
、それは常に値を持つことになりますので、 '必要= true'には、デフォルト値とあまり意味がありません。ここで
は、固定されたコードです。 – jordanm
あなたは 'parser.add_argument( ' - required'、default =" test ")のように各引数にデフォルト値を追加することができます' – Stack
'default =" some value "を使うと動作しません。ファイル。 –