argparse: игнорировать позиционные аргументы, если установлен флаг? - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу предоставить команде 3 аргумента: <version>, <input file> и <output file> при обычном использовании. За исключением того, что есть специфический c флаг --init, который в основном будет запускать программу без каких-либо требований к входным и выходным файлам.

Поэтому в идеале у меня была бы команда, использование которой:

py program.py --init

ИЛИ

py program.py <version> <input file> <output file>

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

Мой код пока:

def get_args():
    parser = argparse.ArgumentParser(description="Tool for FOO-ing a BAR.")
    parser.add_argument(dest="version", help="The version.")
    parser.add_argument(dest="input", help="The input file.")
    parser.add_argument(dest="output", help="The output file.")

    parser.add_argument("-i", "--init", dest="init", action="store_true", help="Foo Init.")

    return parser.parse_args()

Чтобы уточнить:
Либо все 3 аргумента (<version> <input> <output>) ДОЛЖНЫ быть указаны .
ИЛИ
Программа запускается только с флагом --init и должны быть указаны 0 аргументов.

Программа НЕ должна принимать с указанными 0, 1 или 2 аргументами (без --init флаг).

1 Ответ

0 голосов
/ 01 апреля 2020

parser.add_argument имеет параметр по умолчанию ( документы ), который можно использовать здесь для версии, входных и выходных параметров. Теперь вам не понадобится третий init param

...