Python argparse: 在帮助条目之间插入空行
Python argparse: Insert blank line between help entries
使用 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.
您可以创建自己的帮助文本格式化程序来执行此操作。请注意,这要求您非常具体地了解 argparse.HelpFormatter
的实现细节。因此,请考虑包含在每个帮助格式化程序类型描述中的警告:
Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
一旦我们忽略它,创建我们自己的帮助格式化程序在条目之间添加一个空行就非常简单了:
class BlankLinesHelpFormatter (argparse.HelpFormatter):
def _split_lines(self, text, width):
return super()._split_lines(text, width) + ['']
就是这样。现在,当您在将
formatter_class=BlankLinesHelpFormatter
传递给构造函数的同时创建 ArgumentParser
对象时,帮助文本中每个参数之间将出现空行。
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 并将所有内部空白减少为一个空白。
使用 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.
您可以创建自己的帮助文本格式化程序来执行此操作。请注意,这要求您非常具体地了解 argparse.HelpFormatter
的实现细节。因此,请考虑包含在每个帮助格式化程序类型描述中的警告:
Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
一旦我们忽略它,创建我们自己的帮助格式化程序在条目之间添加一个空行就非常简单了:
class BlankLinesHelpFormatter (argparse.HelpFormatter):
def _split_lines(self, text, width):
return super()._split_lines(text, width) + ['']
就是这样。现在,当您在将
formatter_class=BlankLinesHelpFormatter
传递给构造函数的同时创建 ArgumentParser
对象时,帮助文本中每个参数之间将出现空行。
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 并将所有内部空白减少为一个空白。