Argparse: определить, какой субпараметр был использован

Я думаю, что это должно быть легко, но я не понимаю.

Предположим, у меня есть следующий синтаксический анализатор:

import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')

Как я могу определить, какой субпараметр использовался? вызов:

print parser.parse_args(["all"])

дает пустое пространство имен:

Namespace()

Ответ 1

Изменить: Обратитесь к квонскому ответу на этот вопрос, который лучше моего и должен быть принятым ответом.

В соответствии с документацией argparse результат parser.parse_args(...) будет содержать только атрибуты для основного синтаксического анализатора и выбранного дополнительного парсера ". К сожалению, это может быть недостаточно для определения того, какой суб-парсер использовался. В документации для решения этой проблемы рекомендуется использовать метод set_defaults(...) на вспомогательном парсере.

Например, я добавил вызовы set_defaults() к вашему коду:

import argparse

parser = argparse.ArgumentParser( version='pyargparsetest 1.0' )
subparsers = parser.add_subparsers(help='commands')

# all
all_parser = subparsers.add_parser('all', help='process all apps')
all_parser.set_defaults(which='all')

# app
app_parser = subparsers.add_parser('app', help='process a single app')
app_parser.add_argument('appname', action='store', help='name of app to process')
app_parser.set_defaults(which='app')

Теперь, если вы запустите

print parser.parse_args(["all"])

Результат

Namespace(which='all')

Обратитесь к документации add_subparsers() для получения дополнительной информации и другого примера.

Ответ 2

Более простым решением является добавление dest к вызову add_subparsers. Это немного ниже в документации:

[...] Если необходимо проверить имя вызываемого подпарамера, аргумент ключевого слова dest для вызова add_subparsers() будет работать

В вашем примере замените:

subparsers = parser.add_subparsers(help='commands')

с:

subparsers = parser.add_subparsers(help='commands', dest='command')

Теперь, если вы запустите:

print parser.parse_args(["all"])

вы получите

Namespace(command='all')