У меня есть программа с подкомандами, но все они имеют общие аргументы (например, все они требуют входных и выходных каталогов), которые я включил в родительский парсер, чтобы избежать избыточности. Однако я хочу, чтобы каждая подкоманда имела свое значение по умолчанию, но это приводит к тому, что значение, указанное в командной строке, игнорируется.
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')
Я могу обойти это, отдельно добавив аргумент к каждому подпарамеру, но я хотел бы избежать этой избыточности, если это возможно.