Форматирование меню справки ArgParse

#python-3.x #command-line-arguments #argparse

Вопрос:

Я пытаюсь создать более привлекательное меню для ArgParse, в основном просто согласованное форматирование при отображении меню справки. Я понимаю, как использовать различные атрибуты, чтобы сделать что-то обязательным или нет, но не уверен, как отформатировать текст так, чтобы они были согласованными.

Мой текущий код, который имеет отношение к делу, показан ниже

 import argparse

parser = argparse.ArgumentParser(prog='myprogram', description='Select which files to parser and where to save them.')

parser.add_argument('-f', metavar='--file', type=str, help='select a single file to process', required=False)
parser.add_argument('-d', metavar='--dir', type=str, help='filepath directory', required=False)

args = parser.parse_args()
 

Вывод этого кода выполняется при выполнении команды filename.py -h-это
Снимок экрана вывода терминала

Что я хотел бы сделать, так это просто добавить запятую между-f и —file, а также любые дополнительные команды. Я понимаю, что это довольно маленькая деталь, но что я могу сказать, мне нравится последовательно форматировать вещи.

Я запускаю Python v3.8.2 на своей машине и Argparse v1.4.0

Комментарии:

1. Откажитесь metavar= от add_argument звонков. Только держись '--file' !

2. Более распространенным определением аргумента было бы: parser.add_argument('-f', '--file', help='select a single file to process') . Затем пользователь может использовать -f filename или --file filename . Ваше использование --file для метавара будет сбивать с толку.

3. Строка справки по умолчанию будет » — f ФАЙЛ, —файл Выберите ФАЙЛ …». Повторяющийся «ФАЙЛ» может быть заменен или сокращен metavar , но не полностью устранен. Было ТАК много запросов на варианты, особенно на более компактные версии, но для этого требуется подкласс HelpFormatter и изменение метода. Если вам не нравятся детали форматирования, настройка форматера разрешена и даже поощряется; но не ожидайте, что вас будут держать за руку.

4. @hpaulj хорошо, это имеет смысл! Кажется, что существует множество аргументов, и так запутанно знать, когда их использовать, если вообще использовать. Не могли бы вы еще немного поговорить с помощником по информационным технологиям?

Ответ №1:

Это должно проиллюстрировать основные возможности форматирования справки (без подклассов helpformatter).:

 In [1]: import argparse
In [2]: parser=argparse.ArgumentParser()
In [3]: parser.add_argument('-f','--foo',action='store_true', help='a store true
   ...: ');
In [4]: parser.add_argument('-b','--bar',help='basic store');
In [5]: parser.add_argument('-x','--xxx', metavar='',help='blank metavar');
In [6]: parser.print_help()
usage: ipython3 [-h] [-f] [-b BAR] [-x]

optional arguments:
  -h, --help         show this help message and exit
  -f, --foo          a store true
  -b BAR, --bar BAR  basic store
  -x , --xxx         blank metavar
 

Комментарии:

1. в этом так много смысла! Моя единственная путаница сейчас заключается в том, где используется: ipython3 [-h] [-f] [-b БАР] [-x] будет определено

2. parser.format_usage создает строку использования. format_help делает это плюс добавляет строки справки. Фактическое форматирование выполняется методами в HelpFormatter классе, в частности _format_usage методом. Этот метод несколько хрупок и может быть испорчен неправильными символами в metavar . Использование форматирования и справка-это большая задача, включающая в себя столько же кода, сколько и синтаксический анализ.