Первого примечания на argparse
документов - это в основном как документ, а не формальный API. Стандартом для того, что делает argparse
, является сам код, модульные тесты (test/test_argparse.py
) и парализующая проблема обратной совместимости.
Нет никакого «официального» способа доступа к allowed arguments
, поскольку пользователям обычно не нужно знать это (кроме чтения help/usage
).
Но позвольте мне проиллюстрировать с помощью простого синтаксического анализа в iteractive сессии:
In [247]: parser=argparse.ArgumentParser()
In [248]: a = parser.add_argument('pos')
In [249]: b = parser.add_argument('-f','--foo')
add_argument
возвращает объект действий, который он создал. Это не документировано, но очевидно для любого, кто создал парсер в интерактивном режиме.
Объект parser
имеет метод repr
, который отображает основные параметры. Но у него есть много других атрибутов, которые вы можете увидеть с помощью vars(parser)
, или parser.<tab>
в Ipython.
In [250]: parser
Out[250]: ArgumentParser(prog='ipython3', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
Действия также имеют repr
; подкласс Action определяется параметром action
.
In [251]: a
Out[251]: _StoreAction(option_strings=[], dest='pos', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [252]: b
Out[252]: _StoreAction(option_strings=['-f', '--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
vars(a)
и т. Д. Можно использовать для просмотра всех атрибутов.
Атрибут ключа parser
: _actions
, список всех определенных действий. Это основа для всего разбора. Обратите внимание, что оно включает действие help
, которое было создано автоматически. Посмотрите на option_strings
; который определяет, является ли действие позиционным или необязательным.
In [253]: parser._actions
Out[253]:
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
_StoreAction(option_strings=[], dest='pos',....),
_StoreAction(option_strings=['-f', '--foo'], dest='foo', ...)]
_option_string_actions
представляет собой словарь, отображение option_strings
к действиям (те же объекты, которые появляются в _actions
). Ссылки на те объекты Action отображаются повсюду в коде argparse
.
In [255]: parser._option_string_actions
Out[255]:
{'--foo': _StoreAction(option_strings=['-f', '--foo'],....),
'--help': _HelpAction(option_strings=['-h', '--help'],...),
'-f': _StoreAction(option_strings=['-f', '--foo'], dest='foo',...),
'-h': _HelpAction(option_strings=['-h', '--help'], ....)}
In [256]: list(parser._option_string_actions.keys())
Out[256]: ['-f', '--help', '-h', '--foo']
Обратите внимание, что есть ключ для каждой строки -
, длинной или короткой; но нет ничего для pos
, позиционер имеет пустой параметр option_strings
.
Если этот список ключей является тем, что вы хотите, используйте его, и не беспокойтесь о _
. У него нет «общедоступного» псевдонима.
Я могу понять разбор help
, чтобы обнаружить то же самое; но это большая работа, чтобы просто не использовать атрибут «private». Если вы беспокоитесь об изменении недокументированного атрибута, вам также следует беспокоиться о том, что формат справки меняется. Это тоже не часть документов.
help
расположение: parser.format_help
. usage
создан на основе информации в self._actions
. Помощь линии от информации в
for action_group in self._action_groups:
formatter.add_arguments(action_group._group_actions)
(вы не хотите, чтобы попасть в action groups
да?).
Существует еще один способ получения option_strings
- собрать из них _actions
:
In [258]: [a.option_strings for a in parser._actions]
Out[258]: [['-h', '--help'], [], ['-f', '--foo']]
===================
Delving в деталях кода:
parser.add_argument
создает действие, а затем передает его parser._add_action
. Это метод, который заполняет как .actions
, так и action.option_strings
.
self._actions.append(action)
for option_string in action.option_strings:
self._option_string_actions[option_string] = action
Насколько важна эта первоначальная часть «существующего парсера» вопроса? Вы делаете парсер с нуля или импортируете его из другого модуля? Вам нужно включить автоматические ключи «help»? – hpaulj
Я также хотел бы иметь ключи «help», но я в порядке, добавляя их вручную. «Существующая» часть - это реальное ограничение. Я мог подумать или сценарии, когда пользователь не может использовать ваш «трюк». Поэтому, чтобы подчеркнуть, я действительно получаю от ** существующего ** 'ArgumentParser'. – m8mble
'_option_string_actions' будет самым надежным источником информации для существующего анализатора. Просто имейте в виду, как это было заселено. Префиксные символы, помощь SUPPRESS и группы могут изменять макет 'help' и беспорядок с поиском справки. – hpaulj