如何在argparse帮助文本中插入换行符?
我在使用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
不仅仅适用于描述和结尾部分,它还适用于所有的帮助文本(包括参数部分)。