Я столкнулся с подобной проблемой (Python 2.7.6). Я попытался разбить раздел description на несколько строк, используя RawTextHelpFormatter
:
parser = ArgumentParser(description="""First paragraph
Second paragraph
Third paragraph""",
usage='%(prog)s [OPTIONS]',
formatter_class=RawTextHelpFormatter)
options = parser.parse_args()
И получил:
usage: play-with-argparse.py [OPTIONS]
First paragraph
Second paragraph
Third paragraph
optional arguments:
-h, --help show this help message and exit
Так что RawTextHelpFormatter
не является решением. Поскольку он печатает описание так, как оно выглядит в исходном коде, сохраняя все пробельные символы (я хочу сохранить дополнительные вкладки в моем исходном коде для удобства чтения, но я не хочу печатать их все. Кроме того, raw formatter не переносит строки, когда это слишком длинный, например, более 80 символов).
Спасибо @Anton, который вдохновил правильное направление выше . Но это решение нуждается в небольшой модификации, чтобы отформатировать описание раздел.
В любом случае, нужен специальный форматер. Я расширил существующий класс HelpFormatter
и переопределил метод _fill_text
следующим образом:
import textwrap as _textwrap
class MultilineFormatter(argparse.HelpFormatter):
def _fill_text(self, text, width, indent):
text = self._whitespace_matcher.sub(' ', text).strip()
paragraphs = text.split('|n ')
multiline_text = ''
for paragraph in paragraphs:
formatted_paragraph = _textwrap.fill(paragraph, width, initial_indent=indent, subsequent_indent=indent) + '\n\n'
multiline_text = multiline_text + formatted_paragraph
return multiline_text
Сравните с исходным исходным кодом из argparse module:
def _fill_text(self, text, width, indent):
text = self._whitespace_matcher.sub(' ', text).strip()
return _textwrap.fill(text, width, initial_indent=indent,
subsequent_indent=indent)
В оригинальном коде все описание упаковано. В пользовательском редакторе выше весь текст разбивается на несколько частей, и каждый из них форматируется независимо.
Итак, с помощью пользовательского форматера:
parser = ArgumentParser(description= """First paragraph
|n
Second paragraph
|n
Third paragraph""",
usage='%(prog)s [OPTIONS]',
formatter_class=MultilineFormatter)
options = parser.parse_args()
вывод:
usage: play-with-argparse.py [OPTIONS]
First paragraph
Second paragraph
Third paragraph
optional arguments:
-h, --help show this help message and exit