Порядок аргументов в справке определяется методом parser.format_help
:
Definition: parser.format_help(self)
Source:
def format_help(self):
formatter = self._get_formatter()
...
# positionals, optionals and user-defined groups
for action_group in self._action_groups:
formatter.start_section(action_group.title)
formatter.add_text(action_group.description)
formatter.add_arguments(action_group._group_actions)
formatter.end_section()
help
создается путем извлечения объекта formatter
и последующего добавления к нему «разделов». Здесь он перебирает _action_groups
, помещая каждый в свой раздел и добавляя свои действия (аргументы) с помощью метода add_arguments
. Средство форматирования является временным и существует только для создания строк (обычно нескольких строк).
Группы действий включают стандартные postionals
и optionals
, а также все, что создает пользователь. Эти группы используются только для справки, а не для синтаксического анализа. Таким образом, список action_group._group_actions
можно было переупорядочить, не влияя на синтаксический анализ. (парсер имеет свой список действий, parser._actions
).
Это подтверждает наблюдение @mgilson о том, что сортировка p._actions
не влияет на справку, а сортировка _group_actions
влияет.
Сортировка _actions
повлияет на usage
(будь то часть справки или отдельно):
# usage
formatter.add_usage(self.usage, self._actions,
self._mutually_exclusive_groups)
Обратите внимание, что action_groups
не передаются в раздел использования. Раздел использования меняет порядок своих действий, отображая сначала optionals
, затем positionals
.
Сортируйте аргументы до/во время этапа add_argument
, если вы хотите контролировать порядок синтаксического анализа позиционных выражений и их порядок в использовании.
Если вы просто хотите контролировать порядок в группах помощи, не стесняйтесь переупорядочивать элементы в списке ._group_actions
либо перед вызовом средства форматирования, либо внутри него.
Были и другие вопросы SO об управлении порядком действий в файле usage
. Некоторые, например, не хотят, чтобы positionals
располагалось после optionals
.
Я согласен, что класс Formatter громоздок. Но по большей части он отделен от класса Parser. Таким образом, его можно было бы переписать с минимальным влиянием на синтаксический анализ. Существующие подклассы Formatter просто настраивают низкоуровневые методы, которые управляют переносом строк и форматированием строк справки. Важным интерфейсом между синтаксическим анализатором и средством форматирования являются методы format_usage
и format_help
, которые являются относительно более простыми и высокоуровневыми.
подклассы
Несмотря на предупреждение, которое цитирует @grieve, люди создают подклассы HelpFormatter
в соответствии со своими потребностями. Единственное, что удерживает людей от этого, — это какая-то политика компании. Все предупреждение говорит нам о том, что разработчики argparse не пытались представить или задокументировать все изменения, которые пользователи могут захотеть внести. Я даже не смог перечислить те, которые я предложил за последние несколько лет.
person
hpaulj
schedule
27.09.2015