argparse帮助没有重复的ALLCAPS

时间:2012-03-10 00:15:51

标签: python argparse

我想为我的选项显示argparse帮助,方法与默认-h--help-v--version一样,没有ALLCAPS后的文字选项,或至少没有重复的CAPS。

import argparse
p = argparse.ArgumentParser("a foo bar dustup")
p.add_argument('-i', '--ini', help="use alternate ini file")
print '\n', p.parse_args()

这是我目前使用python foobar.py -h获得的:

usage: a foo bar dustup [-h] [-i INI]

optional arguments:
  -h, --help            show this help message and exit
  -i INI, --ini INI     use alternate ini

这就是我想要的:

usage: a foo bar dustup [-h] [-i INI]

optional arguments:
  -h, --help            show this help message and exit
  -i, --ini INI         use alternate ini

这也是可以接受的:

  -i, --ini             use alternate ini

我正在使用python 2.7。

2 个答案:

答案 0 :(得分:15)

您可以自定义usage并将metavar分配给空字符串:

import argparse

p = argparse.ArgumentParser("a foo bar dustup", usage='%(prog)s [-h] [-i INI]')
p.add_argument('-i', '--ini', help="use alternate ini file", metavar='')
p.print_help()

输出

usage: a foo bar dustup [-h] [-i INI]

optional arguments:
  -h, --help   show this help message and exit
  -i , --ini   use alternate ini file

答案 1 :(得分:4)

我可以告诉你有两种选择,

import argparse

p = argparse.ArgumentParser(description="a foo bar dustup")
p.add_argument('-i', '--ini', metavar='', help="use alternate ini file")

print '\n', p.parse_args()

或者您可以编写自定义formatter class,我意识到第一个选项可能不是一个完美的解决方案,因为它消除了使用行中的CAPS。如果重要的是argparse的source,我可以告诉默认的格式化程序类不能完全按照你想要的那样完成。

编辑:

好吧,我继续为你构建了自己的格式化程序类,与其他程序一样......不确定我是否建议你在生产代码中使用它,因为它不会有任何正式的python文档= p

import argparse
from argparse import HelpFormatter

class MyFormatter(HelpFormatter):
    """
        for matt wilkie on SO
    """

    def _format_action_invocation(self, action):
        if not action.option_strings:
            default = self._get_default_metavar_for_positional(action)
            metavar, = self._metavar_formatter(action, default)(1)
            return metavar

        else:
            parts = []

            # if the Optional doesn't take a value, format is:
            #    -s, --long
            if action.nargs == 0:
                parts.extend(action.option_strings)

            # if the Optional takes a value, format is:
            #    -s ARGS, --long ARGS
            else:
                default = self._get_default_metavar_for_optional(action)
                args_string = self._format_args(action, default)
                for option_string in action.option_strings:
                    parts.append(option_string)

                return '%s %s' % (', '.join(parts), args_string)

            return ', '.join(parts)

    def _get_default_metavar_for_optional(self, action):
        return action.dest.upper()

p = argparse.ArgumentParser("a foo bar dustup", formatter_class=MyFormatter)
p.add_argument('-i', '--ini', help="use alternate ini file")
p.print_help()