Помощь с помощью argparse без дублирования ALLCAPS

Я хотел бы отображать справку 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.

Ответ 1

Вы можете настроить 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

Ответ 2

Хорошо, что я могу сказать, у вас есть два варианта:

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()

или вы можете написать собственный класс форматирования, я понимаю, что первый вариант может быть не идеальным решением, поскольку он избавляется от CAPS в строке использования. Если это важно здесь source для argparse, то из того, что я могу сказать, классы по умолчанию для форматирования не будут делать именно то, что вы хотите.

Edit:

Хорошо, я пошел вперед и построил вам свой собственный класс форматирования, так же, как и другие... не уверен, что я рекомендую вам использовать это в производственном коде, поскольку для него не будет официальной документации на python = р

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()