2

在 argparse 中指定帮助时,我经常在参数中使用%(default)sor之类的字符串来显示默认参数。不过,语法有点奇怪:我认为它是使用.%(const)shelp=%format()

那么这些库只是使用“旧”替换语法,还是来​​自其他地方?据说%替换运算符会在某个时候消失,那么这些库会更改为'{}'.format()语法吗?

4

2 回答 2

4

是的,argparseandConfigParser库在内部使用旧式%字符串格式化语法。这些库是之前开发的str.format()并且format()是可用的,或者对于argparse旨在与早期 Python 版本兼容的库作者而言。

如果删除了%格式,那么这些库确实{}必须使用占位符来使用字符串格式。

然而,由于各种原因,%旧式字符串格式化风格在可预见的未来仍然存在;它已被“弃用”;str.format()是首选,但%为了向后兼容而保留。

于 2013-08-08T14:18:40.037 回答
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'
于 2013-08-09T03:09:49.363 回答