#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
. Использование форматирования и справка-это большая задача, включающая в себя столько же кода, сколько и синтаксический анализ.