argparse和ConfigParser字符串替换语法来自哪里?

时间:2013-08-08 14:16:17

标签: python argparse configparser

在argparse中指定帮助时,我经常在%(default)s参数中使用%(const)shelp=等字符串来显示默认参数。但是语法有点奇怪:我认为它是从使用%格式化python字符串的日子开始的,但是从python 2.6开始,格式化字符串的标准方法就是使用format()函数。

这些库只是使用'旧'替换语法,还是来​​自其他地方呢?已经声明%替换运算符会在某个时刻消失,这些库是否会更改为'{}'.format()语法呢?

2 个答案:

答案 0 :(得分:4)

是的,argparseConfigParser库在内部使用旧式%字符串格式化语法。这些库是在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'