Python argparse опция подпарсеров

Я пытался придумать способ заставить argparse работать с вложенными необязательными подпарсерами.

Базовый пример того, что я хотел бы видеть, - это наличие первого подпапки search, который выполняет поиск по некоторым имеющимся у меня данным. Здесь есть несколько необязательных вещей, по которым мы можем искать (например, все, группа, тип, теги и т. Д.). Пример может выглядеть так

$ python test.py search --type <type> --group <group>

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

$ python test.py search --type <type> --group <group> update --tags <new_tags>

Проблема, с которой я сталкиваюсь, заключается в том, что когда я помещаю синтаксический анализатор "update" в качестве подпарамера для подпапки "search", если я запускаю первый пример, я получаю ошибку:

$ python test.py search --type <type> --group <group>
test.py search: error: too few arguments

Чтобы обойти это, я слышал, что предложили Наргс ( http://www.alanbriolat.co.uk/optional-positional-arguments-with-argparse.html), но я не мог заставить его работать с опцией --option. Возможно, я что-то там упускаю? Я также смотрел на ошибку 9253 ( http://bugs.python.org/issue9253), в частности на часть "git remote", но я там не нашел решения.

Какой-нибудь совет, чтобы заставить это работать в argparse? Я мог бы при необходимости использовать свой собственный анализатор аргументов, но было бы лучше, если бы я мог использовать argparse.

Благодарю.

1 ответ

Если я правильно читаю вас, то речь идет не о вложенных подпарасерах, а о том, что необязательным может быть подпарасер.

Аргумент подпарсера - это позиционный аргумент, который принимает выбор. Это, по сути, требуется. Опциональные параметры принимают обязательный параметр, а позиционные - нет.

Но, как обсуждалось в Bug 9253, в разрабатываемой версии подпарсеры стали необязательными (необязательно). Это потому, что произошли изменения в том, как argparse проверяется на отсутствие аргументов. Я предложил патч, который делает подпарсеры обязательными по умолчанию, но также дал пользователю возможность сделать его необязательным. http://bugs.python.org/file29793/required.patch

К сожалению, это включает в себя настройку argparse внутренних органов.

Как насчет пропущенных вложенных подпарсеров и использования parse_known_args? Если мои предположения верны, необязательная вложенная команда subparser (и ее аргументы) будет возвращена в 'rest', который вы затем можете обработать с помощью нового парсера.

Другие вопросы по тегам