Аргумент командной строки перезаписывается значением по умолчанию при использовании подпарсера - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть программа с подкомандами, но все они имеют общие аргументы (например, все они требуют входных и выходных каталогов), которые я включил в родительский парсер, чтобы избежать избыточности. Однако я хочу, чтобы каждая подкоманда имела свое значение по умолчанию, но это приводит к тому, что значение, указанное в командной строке, игнорируется.

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')

Я могу обойти это, отдельно добавив аргумент к каждому подпарамеру, но я хотел бы избежать этой избыточности, если это возможно.

1 Ответ

0 голосов
/ 19 апреля 2019

Один из обходных путей - проверить значение input_dir после синтаксического анализа и заменить значение по умолчанию для конкретного субпарсера.

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(alt_input_dir=".")

process_parser = subparsers.add_parser("process")
process_parser.set_defaults(alt_input_dir="SOME_OTHER_DIR")

args = top_parser.parse_args()
if args.input_dir is None:
    args.input_dir = args.alt_input_dir
del args.alt_input_dir
...