在 argparse 中指定帮助时,我经常在参数中使用%(default)s
or之类的字符串来显示默认参数。不过,语法有点奇怪:我认为它是使用.%(const)s
help=
%
format()
那么这些库只是使用“旧”替换语法,还是来自其他地方?据说%
替换运算符会在某个时候消失,那么这些库会更改为'{}'.format()
语法吗?
在 argparse 中指定帮助时,我经常在参数中使用%(default)s
or之类的字符串来显示默认参数。不过,语法有点奇怪:我认为它是使用.%(const)s
help=
%
format()
那么这些库只是使用“旧”替换语法,还是来自其他地方?据说%
替换运算符会在某个时候消失,那么这些库会更改为'{}'.format()
语法吗?
是的,argparse
andConfigParser
库在内部使用旧式%
字符串格式化语法。这些库是之前开发的str.format()
并且format()
是可用的,或者对于argparse
旨在与早期 Python 版本兼容的库作者而言。
如果删除了%
格式,那么这些库确实{}
必须使用占位符来使用字符串格式。
然而,由于各种原因,%
旧式字符串格式化风格在可预见的未来仍然存在;它已被“弃用”;str.format()
是首选,但%
为了向后兼容而保留。
自定义帮助格式的认可方法是继承 HelpFormatter。用户无需等待未来的 Python 版本即可执行此操作。
此格式化程序在 2 个位置实现 {}.format。
class NewHelpFormatter(argparse.HelpFormatter):
# _format_usage - format usage, but only uses dict(prog=self._prog)
def _format_text(self, text):
# for description, epilog, version
if '{prog}' in text:
text = text.format(prog=self._prog) # change from %
text_width = self._width - self._current_indent
indent = ' ' * self._current_indent
return self._fill_text(text, text_width, indent) + '\n\n'
def _expand_help(self, action):
params = dict(vars(action), prog=self._prog)
for name in list(params):
if params[name] is argparse.SUPPRESS:
del params[name]
for name in list(params):
if hasattr(params[name], '__name__'):
params[name] = params[name].__name__
if params.get('choices') is not None:
choices_str = ', '.join([str(c) for c in params['choices']])
params['choices'] = choices_str
return self._get_help_string(action).format(**params) # change from %
例如:
parser = argparse.ArgumentParser(prog='NewFormatter',
formatter_class=NewHelpFormatter,
description='{prog} description')
parser.add_argument('foo',nargs=3, default=[1,2,3],
help='nargs:{nargs} prog:{prog!r} defaults:{default} last:{default[2]}')
parser.add_argument('--bar',choices=['yes','no'],
help='choices: {choices!r}')
parser.print_help()
产生:
usage: NewFormatter [-h] [--bar {yes,no}] foo foo foo
NewFormatter description
positional arguments:
foo nargs:3 prog:'NewFormatter' defaults:[1, 2, 3] last:3
optional arguments:
-h, --help show this help message and exit
--bar {yes,no} choices: 'yes, no'