我也遇到过类似的问题(Python 2.7.6)。我尝试使用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格式化器不会在行太长时换行,例如超过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模块的原始源代码比较:
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