在argparse中指定帮助时,我经常在%(default)s
参数中使用%(const)s
或help=
等字符串来显示默认参数。但是语法有点奇怪:我认为它是从使用%
格式化python字符串的日子开始的,但是从python 2.6开始,格式化字符串的标准方法就是使用format()
函数。
这些库只是使用'旧'替换语法,还是来自其他地方呢?已经声明%
替换运算符会在某个时刻消失,这些库是否会更改为'{}'.format()
语法呢?
答案 0 :(得分:4)
是的,argparse
和ConfigParser
库在内部使用旧式%
字符串格式化语法。这些库是在str.format()
和format()
可用之前开发的,或者argparse
库作者旨在与早期Python版本兼容。
如果 ,那么这些库确实必须使用%
占位符来使用字符串格式。
但是,出于各种原因,{}
旧式字符串格式样式在可预见的未来仍然存在;它一直是'未弃用'; %
是首选,但保留str.format()
是为了向后兼容。
答案 1 :(得分:1)
自定义帮助格式的批准方法是子类化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'