如何格式化OptionParser()的帮助信息?

3 投票
2 回答
1690 浏览
提问于 2025-04-18 10:25

如何格式化OptionParser()的帮助信息?它似乎忽略了换行符?请看下面的代码。

parser = OptionParser()
parser.add_option("--s", dest="s", type="string", help="first line \n second line")

意图:

current output:
.... first line \n second line

expected output:
.... first line 
     second line

2 个回答

2

看看这个 Lib/optparse.py 文件。

class HelpFormatter
    def format_option
    ...
    if option.help:
        help_text = self.expand_default(option)
        help_lines = textwrap.wrap(help_text, self.help_width)
        result.append("%*s%s\n" % (indent_first, "", help_lines[0]))
        result.extend(["%*s%s\n" % (self.help_position, "", line)
                       for line in help_lines[1:]])

换句话说,你的 help 字符串会经过 textwrap.wrap 这个处理。简单测试一下这个函数可以发现,它会去掉里面的 \n,并根据需要把行分开。

argparse 一样,你可以通过创建一个 HelpFormatter 的子类来定制你的帮助信息,并重写一些特定的方法,比如这个方法。举个例子,你可以把 textwrap 的调用换成 help_lines = help_text.splitlines(),这样虽然失去了自动换行的功能,但你可以更好地控制帮助信息的显示效果。

OptionParser 接受一个 formatter 参数。IndentedHelpFormatter 就是一个定制格式化类的例子。

argparse 中,RawTextHelpFormatter 类就是做这样的修改,把 wrap 的调用换成了 splitlines()

1

我可以推荐你使用 argparse 吗?

我不太确定 OptionParser 是否支持这个,不过我建议你使用三重引号
也就是:

parser = OptionParser()
parser.add_option('--s',
                  dest='s'
                  type='string'
                  help='''
With triple quotes I can directly put in anything including line spaces.
\n will appear as a string rather than a newline.''')

argparse 的例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--s',
                  help='''first line
second line''')
args = parser.parse_args()
print args.s

撰写回答