サブコマンドを含むプログラムがありますが、それらはすべて共通の引数 (たとえば、入力ディレクトリと出力ディレクトリが必要) を持ち、冗長性を避けるために親パーサーに含めました。ただし、各サブコマンドに異なるデフォルト値を設定したいのですが、これにより、コマンドラインで指定された値が無視されます。
MWE:
import argparse
top_parser = argparse.ArgumentParser()
top_parser.add_argument("--input-dir", type=str)
subparsers = top_parser.add_subparsers()
generate_parser = subparsers.add_parser("generate")
generate_parser.set_defaults(input_dir=".")
process_parser = subparsers.add_parser("process")
process_parser.set_defaults(input_dir="SOME_OTHER_DIR")
generate_args = top_parser.parse_args("--input-dir USE_THIS_DIR generate".split())
print("generate_args = ", generate_args)
process_args = top_parser.parse_args("--input-dir USE_THIS_DIR process".split())
print("process_args = ", process_args)
これは与える:
generate_args = Namespace(input_dir='.')
process_args = Namespace(input_dir='SOME_OTHER_DIR')
でも私はしたい:
generate_args = Namespace(input_dir='USE_THIS_DIR')
process_args = Namespace(input_dir='USE_THIS_DIR')
各サブパーサーに引数を個別に追加することでこれを回避できますが、可能であればこの冗長性を避けたいと思います。