Допустим, у меня есть простая программа под названием readfile.py
, которая поддерживает аргументы командной строки, используя Python argparse
.
Программа читает из файла, указанного позиционным аргументом input
. Без указания дополнительных аргументов эта программа не очень увлекательна. Он просто читает из input
и завершает работу. Необязательный аргумент --output [OUTPUT_FILE]
означает, что входной файл должен быть записан в файл. OUTPUT_FILE
также является необязательным. Если он не указан, ввод должен быть записан в default.out
.
Я настроил свой парсер аргументов следующим образом:
parser = argparse.ArgumentParser(description='Read from a file')
parser.add_argument(
'input',
help='file to read from')
parser.add_argument(
'--output',
nargs='?',
const='default.out',
default=None,
help="""write file to %(metavar)s. If %(metavar)s isn't
specified, write file to %(const)s.""",
metavar='OUTPUT_FILE')
args = parser.parse_args()
return args.file, args.output_file
Примечание. Я использую default=None
, так что если --ouput
не отображается в командной строке, я могу обнаружить его отсутствие с помощью None.
Что дает сигнатуру использования, подобную этой:
usage: readfile.py [-h] [--output [OUTPUT_FILE]] input
Это обрабатывает аргументы, как и ожидалось, если я запускаю
python readfile.py input.in --output somefile.out
or
python readfile.py --output somefile.out input
Он устанавливает output
в default.out
, если я запускаю
python readfile.py input.in --output
но если я побегу
python readfile.py --output input.in
он жалуется на то, что аргументов слишком мало. Я думал, что argparse будет достаточно «умным», чтобы интерпретировать этот шаблон, установив input
в input.in
и output
в default.out
. Сгенерированное использование даже предполагает это.
Я что-то упускаю?