Я использую argparse
в Python 2.7 для анализа параметров ввода. Один из моих вариантов - это множественный выбор. Я хочу сделать список в тексте справки, например,
from argparse import ArgumentParser
parser = ArgumentParser(description='test')
parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
help="Some option, where\n"
" a = alpha\n"
" b = beta\n"
" g = gamma\n"
" d = delta\n"
" e = epsilon")
parser.parse_args()
Тем не менее, argparse
удаляет все новые строки и последовательные пробелы. Результат выглядит как
~ / Загрузки: 52 $ python2.7 x.py -h использование: x.py [-h] [-g {a, b, g, d, e}] тест необязательные аргументы: -h, --help показать это справочное сообщение и выйти -g {a, b, g, d, e} Некоторая опция, где a = альфа b = бета g = гамма d = дельта e = эпсилон
Как вставить новые строки в тексте справки?
argparse
, а не переводчиком, поэтому переключение на"""..."""
не поможет.Ответы:
Попробуйте использовать
RawTextHelpFormatter
:источник
Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
создать подкласс этого класса, но, к сожалению, так что, вероятно, это не очень хорошая идея, хотя это может и не иметь значения, поскольку предполагается, что 2.7 будет последним 2.x питоном, и вы все равно должны будете реорганизовать многие вещи для 3.x Я на самом деле запускаю 2.6 сargparse
установленным через,easy_install
так что документация сама может быть устаревшей.RawDescriptionHelpFormatter
который работает только на описание и эпилог, а не текст справки.RawTextHelpFormatter
, ведущие и конечные переводы строки удаляются. Чтобы обойти это, вы можете просто добавить два или более последовательных символа новой строки; все, кроме одного перевода строки, выживут.class Formatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): pass
и тогдаformatter_class=Formatter
.Если вы просто хотите переопределить одну опцию, вы не должны использовать
RawTextHelpFormatter
. Вместо этого создайте подклассHelpFormatter
и выделите специальное вступление для параметров, которые должны обрабатываться «raw» (я использую"R|rest of help"
):И использовать это:
Любые другие вызовы, с
.add_argument()
которых не начинается помощь,R|
будут упакованы как обычно.Это часть моих улучшений в argparse . Полный SmartFormatter также поддерживает добавление значений по умолчанию ко всем параметрам и необработанный ввод описания утилит. Полная версия имеет свой собственный
_split_lines
метод, так что любое форматирование, например, для строк версии, сохраняется:источник
parser.add_argument('-v', '--version', action='version',version=get_version_str())
Можно ли распространить это на этот случай?_split_lines
и сохраняет разрывы строк (нет необходимости указывать «R |» в начале, если вы хотите эту опцию, исправьте_VersionAction.__call__
метод_VersionAction.__call__
что, скорее всего, я бы хотел, чтобыparser.exit(message=version)
вместо использования отформатированной версии. Есть ли способ сделать это, не выпуская исправленную копию argparse?__call__
в_VersionAction
делаяargparse._VersionAction.__call__ = smart_version
после определенияdef smart_version(self, parser, namespace, values, option_string=None): ...
Еще один простой способ сделать это - включить текстовую переноску .
Например,
Таким образом, мы можем избежать длинного пустого пространства перед каждой выходной строкой.
источник
Я столкнулся с подобной проблемой (Python 2.7.6). Я попытался разбить раздел описания на несколько строк, используя
RawTextHelpFormatter
:И получил:
Так что
RawTextHelpFormatter
это не решение проблемы. Поскольку он печатает описание так, как оно выглядит в исходном коде, сохраняя все пробельные символы (я хочу сохранить дополнительные вкладки в моем исходном коде для удобства чтения, но я не хочу печатать их все. Также необработанный форматировщик не переносит строки, когда это слишком длинный, более 80 символов например).Спасибо @Anton, который вдохновил правильное направление выше . Но это решение нуждается в небольшой модификации, чтобы отформатировать раздел описания .
В любом случае, нужен специальный форматер. Я расширил существующий
HelpFormatter
класс и переопределил_fill_text
метод следующим образом:Сравните с исходным исходным кодом из модуля argparse :
В оригинальном коде все описание упаковано. В пользовательском редакторе выше весь текст разбит на несколько кусков, и каждый из них форматируется независимо.
Итак, с помощью пользовательского форматера:
выход:
источник
HelpFormatter
создание подклассов проблематично, так как разработчики argparse гарантируют, что имя класса сохранится в будущих версиях argparse. Они в основном написали себе пустую проверку, чтобы они могли изменить имена методов, если им было бы удобно это сделать. Я нахожу это расстраивающим; самое меньшее, что они могли бы сделать, - это раскрыть несколько методов в API.Я хотел, чтобы в тексте описания были как ручные разрывы строк, так и автоматическая обертка; но ни одно из предложенных здесь предложений не сработало для меня - поэтому я в итоге изменил класс SmartFormatter, приведенный в ответах здесь; проблемы с именами методов argparse, не являющимися публичным API, несмотря на это, вот что у меня есть (как файл называется
test.py
):Вот как это работает в 2.7 и 3.4:
источник
Начиная с описанного выше SmartFomatter, я остановился на этом решении:
Обратите внимание, что странным образом аргумент formatter_class, передаваемый парсеру верхнего уровня, не наследуется sub_parsers, его необходимо передавать снова для каждого созданного sub_parser.
источник
Предисловие
На этот вопрос
argparse.RawTextHelpFormatter
это полезно для меня.Теперь я хочу поделиться, как я использую
argparse
.Я знаю, что это не может быть связано с вопросом,
но эти вопросы меня беспокоили некоторое время.
Поэтому я хочу поделиться своим опытом, надеюсь, что это будет кому-то полезно.
Вот так.
Сторонние модули
колорама : для изменения цвета текста:
pip install colorama
пример
Где класс
FormatText
является следующимисточник