如何在argparse帮助文本中插入换行符?

496 投票
15 回答
159411 浏览
提问于 2025-04-16 04:57

我在使用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会把所有的换行和连续的空格都去掉。结果看起来像这样:

~/Downloads:52$ python2.7 x.py -h
usage: x.py [-h] [-g {a,b,g,d,e}]

test

optional arguments:
  -h, --help      show this help message and exit
  -g {a,b,g,d,e}  Some option, where a = alpha b = beta g = gamma d = delta e
                  = epsilon

那我该怎么在帮助文本中插入换行呢?

15 个回答

44

还有一种简单的方法就是使用 textwrap 这个库。

比如说,

import argparse, textwrap
parser = argparse.ArgumentParser(description='some information',
        usage='use "python %(prog)s --help" for more information',
        formatter_class=argparse.RawTextHelpFormatter)

parser.add_argument('--argument', default=somedefault, type=sometype,
        help= textwrap.dedent('''\
        First line
        Second line
        More lines ... '''))

这样一来,我们就可以避免每行输出前面出现很长的空白了。

usage: use "python your_python_program.py --help" for more information

Prepare input file

optional arguments:
-h, --help            show this help message and exit
--argument ARGUMENT
                      First line
                      Second line
                      More lines ...
103

如果你只是想修改一个选项的帮助信息,那就不要使用 RawTextHelpFormatter。相反,你可以创建一个 HelpFormatter 的子类,并为那些需要“原始”处理的选项提供一个特别的介绍(我使用的是 "R|后面的帮助信息"):

import argparse

class SmartFormatter(argparse.HelpFormatter):

    def _split_lines(self, text, width):
        if text.startswith('R|'):
            return text[2:].splitlines()  
        # this is the RawTextHelpFormatter._split_lines
        return argparse.HelpFormatter._split_lines(self, text, width)

然后使用它:

from argparse import ArgumentParser

parser = ArgumentParser(description='test', formatter_class=SmartFormatter)

parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
    help="R|Some option, where\n"
         " a = alpha\n"
         " b = beta\n"
         " g = gamma\n"
         " d = delta\n"
         " e = epsilon")

parser.parse_args()

对于其他调用 .add_argument() 的地方,如果帮助信息不以 R| 开头,那么它们会像正常一样被处理。

这是我对 argparse 的一些改进的一部分。完整的 SmartFormatter 还支持为所有选项添加默认值,以及原始输入的工具描述。完整版本有自己的 _split_lines 方法,这样对版本字符串等的任何格式化都会被保留:

parser.add_argument('--version', '-v', action="version",
                    version="version...\n   42!")
584

试试使用 RawTextHelpFormatter,这样可以保留你所有的格式:

from argparse import RawTextHelpFormatter
parser = ArgumentParser(description='test', formatter_class=RawTextHelpFormatter)

它和 RawDescriptionHelpFormatter 有点像,不过 RawTextHelpFormatter 不仅仅适用于描述和结尾部分,它还适用于所有的帮助文本(包括参数部分)。

撰写回答