Несколько аргументов одного типа - PullRequest
0 голосов
/ 30 сентября 2018

Я использую argparse для генерации CLI.Есть два позиционных аргумента, которые имеют тип str и могут встречаться несколько раз (то есть nargs = '+').

Как выглядит мой текущий код:

    parser.add_argument('-a', type=str, nargs='+', required=True,
                        help='argument a')
    parser.add_argument('-b', type=str, nargs='+', required=True,
                        help='argument b')

Однако, это не очень хорошее решение, так как a и b являются «необязательными аргументами» в справочном документе.Я хочу сделать a и b одновременно позиционными.

Есть ли способ сделать это в argparse?Такие как:

python main.py a=["a_1", "a_2"] b=["b_1", "b_2"]

1 Ответ

0 голосов
/ 02 октября 2018

help с вашим начальным определением:

usage: stack52580176.py [-h] -a A [A ...] -b B [B ...]

optional arguments:
  -h, --help    show this help message and exit
  -a A [A ...]  argument a
  -b B [B ...]  argument b

Строка использования показывает, что для -a требуется хотя бы один аргумент;то же самое для -b.

Да, 2 аргумента находятся в группе optional arguments.Единственная альтернатива по умолчанию - positional arguments.Не существует «обязательной» группы или «обязательной, но помеченной» группы.

Но замена ввода типа

python main.py -a a_1 a_2 -b b_1 b_2

на:

python main.py a=["a_1", "a_2"] b=["b_1", "b_2"]

будетнеудобно как для ваших пользователей, так и для вас самих.Потребуются дополнительные кавычки, чтобы оболочка не разбилась на все пробелы.И вам придется проанализировать строку 'a = ["a_1", "a_2"]' самостоятельно.

Но если вас беспокоит только имя группы, мы можем изменить это с помощью аргумент_группы * 1021.*

import argparse
parser = argparse.ArgumentParser()
g = parser.add_argument_group('required arguments:')
g.add_argument('-a', type=str, nargs='+', required=True,
                        help='argument a')
g.add_argument('-b', type=str, nargs='+', required=True,
                        help='argument b')
parser.print_help()

, который выдает:

usage: stack52580176.py [-h] -a A [A ...] -b B [B ...]

optional arguments:
  -h, --help    show this help message and exit

required arguments::
  -a A [A ...]  argument a
  -b B [B ...]  argument b

Если бы аргументы не были помечены как required, использование имело бы дополнительные []:

usage: stack52580176.py [-h] [-a A [A ...]] [-b B [B ...]]

возможность указания required (и «?») стирает обычное различие между optionals и positionals.У нас могут быть обязательные дополнительные и дополнительные позиции.

...