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

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

$ ./script.py [-o <file1> <file2> ...] inputfile

Официальная argparse документация наиболее точно говорит о

parser.add_argument("-v", "--verbosity", type=int, help="increase output verbosity")
args = parser.parse_args()

, где пользователь вводит одну позициюпод-аргумент (возможно, из набора вариантов) после флага -v.Этот позиционный под-аргумент затем сохраняется в args.verbosity.

Таким образом, представляется, что аргумент флага должен быть включен в ту же строку add_argument().Можете ли вы объявить какое-либо специальное имя для переменной этого под-аргумента (скажем, args.outputfile1)?Может ли флаг принимать более одного под аргумента?Можете ли вы настроить внешний вид этой переменной в меню справки?По умолчанию это что-то вроде -o OUTPUT, --output OUTPUT Save output data to a file OUTPUT.Можем ли мы изменить его следующим образом: -o <SomethingElse>?

Есть ли еще документация, в которой обсуждается этот аспект?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

С определением типа:

parser.add_argument('-o','--output', dest='output_file_name', nargs='+')

вы можете указать в командной строке:

$ ./script.py -o file1 file2

и получите args.output_file_name, равный ['file1','file2']. «+» Означает один или несколько аргументов (другие значения nargs задокументированы).

Но

$ ./script.py -o file1 file2 an_input_file

где 'an_input_file' идет к позиционному аргументу, труднее достичь. «*» жадный, забирает все, ничего не оставляет для позиционного. Лучше определить еще один дополнительный

parser.add_argument('-i','--input')

$ ./script.py -o file1 file2 -i an_input_file

Если '-o' определено как действие 'добавления', вы можете использовать:

$ ./script.py -o file1 -o file2 -i an_input_file

Как правило, вы получаете лучший контроль, используя дополнительные функции. Позиционеры, потому что они «анализируют» по позиции, а не по значению, сложнее использовать в причудливых комбинациях.

Параметр metavar позволяет изменить отображение help.

1 голос
/ 08 июня 2019

Ваш предложенный интерфейс довольно необычный. Чаще всего люди указывают одну и ту же опцию несколько раз, потому что трудно отличить входной файл ./script.py [-o file1 file2 ...] от ./script.py [-o file1] file2 inputfile. Возможно, это еще не проблема, но когда вы добавите опции или запретные аргументы, ваш необычный дизайн станет проблемой.

Я бы порекомендовал сделать одно из следующих решений:

1. Повторите флаг опции

./script.py -o file1 -o file2 inputfile

2. Сделайте ваш выбор логическим флагом

Измените свой API, чтобы -o означало, что все аргументы, кроме последнего, являются выходными файлами: ./script.py -o output1 output2 ... inputfileislast

...