Можно ли предоставить выбор из двух позиционных аргументов, где должен быть выбран один из двух? - PullRequest
0 голосов
/ 29 января 2019

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

пример того, как я ожидаю, что CLI будет использовать этот аргумент: ./myscript.py add --user USERNAME или ./myscript.py delete --user USERNAME или ./myscript.py delete --database DATABASE и т. д.

Бонусные баллы, если мы можем как-то сделать этот позиционный аргумент ненужным

PS Я не хочу делать бонусный вопрос основным вопросом... это гораздо менее важно:)

Спасибо всем

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Вы можете ограничить возможные значения параметром choices.И сделайте это необязательным с '?'nargs:

parser=argparse.ArgumentParser()
parser.add_argument('foo',choices=['abc','def'],nargs='?')
parser.add_argument('-d')     # flagged options 
args = parser.parse_args()
print(args)

Позиционирование может происходить в любом порядке относительно опционов.

Использование более чем одного позиционирования, где "?" Немного сложнее, см.: Python argparse, Значение после позиционного аргумента

Для большего контроля над тем, какой необязательный параметр разрешен с этими позиционными значениями, посмотрите на механизм подпарсеров.Но для начала попробуйте эту простую версию.

Тест с:

print(parser.parse_args([]))   # no input, ok
print(parser.parse_args(['-d', '1', 'abc']  # ok
parser_parse_args(['adf'])  # error
0 голосов
/ 29 января 2019

Привет, ты можешь использовать взаимоисключающую группу.Из официальных документов:

>>> parser = argparse.ArgumentParser(prog='PROG')
>>> group = parser.add_mutually_exclusive_group()
>>> group.add_argument('--foo', action='store_true')
>>> group.add_argument('--bar', action='store_false')
>>> parser.parse_args(['--foo'])
Namespace(bar=True, foo=True)
>>> parser.parse_args(['--bar'])
Namespace(bar=False, foo=False)
>>> parser.parse_args(['--foo', '--bar'])
usage: PROG [-h] [--foo | --bar]
PROG: error: argument --bar: not allowed with argument --foo
...