Python argparse:在帮助条目之间插入空白行

时间:2015-04-07 05:31:26

标签: python argparse

使用argparse时,将--help传递给程序会生成帮助文本。不幸的是,它很难阅读,因为选项之间没有空行。这里有一个摘录来说明:

optional arguments:
  -h, --help            show this help message and exit
  -u FILENAME, --up-sound FILENAME
                        The sound to play when the network comes up. Default:
                        "/path/to/some/sound/file.wav"
  -d FILENAME, --down-sound FILENAME
                        The sound to play when the network goes down. Default:
                        "/path/to/some/other/sound/file.wav"
  -p EXECUTABLE, --player EXECUTABLE
                        The program to use to play sounds. Default: "play"
  -s, --silent          If specified, network_monitor.py will not play any
                        sounds.
  -c, --no-clear-screen
                        If specified, screen will not be cleared (nor extra
                        blank lines added) before network_monitor.py runs.
  --version             show program's version number and exit

请注意,在某些情况下,例如-p-s之间或-c--version之间,很难一眼就知道哪些帮助文字适用于哪个选项。条目之间应该有一个空行。例如:

  -p EXECUTABLE, --player EXECUTABLE
                        The program to use to play sounds. Default: "play"

  -s, --silent          If specified, network_monitor.py will not play any
                        sounds.

我怎样才能做到这一点? Several other个问题建议使用argparse.RawTextHelpFormatter。问题是,如果我使用它,我必须编写自己的逻辑来包装帮助文本,因为原始文本帮助格式化程序不进行格式化。显而易见的答案是将'\n\n'附加到帮助文本的末尾并使用默认格式化程序。但令人费解的是,新行被剥夺了。

这里的前进方向是什么?我使用的是Python 3.4。

2 个答案:

答案 0 :(得分:8)

您可以创建自己的帮助文本格式化程序来执行此操作。请注意,这要求您非常具体地argparse.HelpFormatter的实现细节。因此,请考虑每个帮助格式化程序类型说明中包含的此警告:

  

只有此类的名称才被视为公共API。该类提供的所有方法都被视为实现细节。

一旦我们忽略了这一点,创建我们自己的帮助格式化程序,在条目之间添加一个空行非常简单:

class BlankLinesHelpFormatter (argparse.HelpFormatter):
    def _split_lines(self, text, width):
        return super()._split_lines(text, width) + ['']

就是这样。现在,当您在将 formatter_class=BlankLinesHelpFormatter传递给构造函数时创建ArgumentParser对象时,帮助文本中每个参数之间将出现空白行。

答案 1 :(得分:2)

poke's方法很好。请注意,RawTextHelpFormatter也会修改此方法,将其简化为:

def _split_lines(self, text, width):
    return text.splitlines()
可以调整

poke's方法以获得更多控制权

class BlankLinesHelpFormatter (argparse.HelpFormatter):
    # add empty line if help ends with \n
    def _split_lines(self, text, width):
        lines = super()._split_lines(text, width)
        if text.endswith('\n'):
            lines += ['']
        return lines

有了这个:

parser = argparse.ArgumentParser(description='A description',
    formatter_class=BlankLinesHelpFormatter,
    epilog='Epilog line',
    )
parser.add_argument('-u', '--up-sound', metavar='FILENAME',
    help='The sound to play when the network comes up. Default:"%(default)s"\n',
    default="/path/to/some/sound/file.wav")
# note \n in above help
parser.add_argument('-d', '--down-sound', metavar='FILENAME',
    help='The sound to play when the network goes down. Default:"%(default)s"',
    default="/path/to/some/other/sound/file.wav")
parser.add_argument('-s','--silent', action='store_true',
    help='If specified, network_monitor.py will not play any sounds.')
parser.add_argument('positional', nargs='*', help='positional argument')
parser.print_help()

显示:

usage: stack29484443.py [-h] [-u FILENAME] [-d FILENAME] [-s]
                        [positional [positional ...]]

A description

positional arguments:
  positional            positional argument

optional arguments:
  -h, --help            show this help message and exit
  -u FILENAME, --up-sound FILENAME
                        The sound to play when the network comes up.
                        Default:"/path/to/some/sound/file.wav"

  -d FILENAME, --down-sound FILENAME
                        The sound to play when the network goes down.
                        Default:"/path/to/some/other/sound/file.wav"
  -s, --silent          If specified, network_monitor.py will not play any
                        sounds.

Epilog line

作为参考,默认_split_lines为:

def _split_lines(self, text, width):
    text = self._whitespace_matcher.sub(' ', text).strip()
    return _textwrap.wrap(text, width)
    # self._whitespace_matcher = _re.compile(r'\s+')

这将删除最终\ n并将所有内部空白缩小为一个空白。