помощь argparse без дубликатов ALLCAPS - PullRequest
17 голосов
/ 10 марта 2012

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

16 голосов
/ 10 марта 2012

Вы можете настроить 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
4 голосов
/ 10 марта 2012

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

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 в строке использования. Если это так важно, вот источник для argparse, из того, что я могу сказать, классы форматирования по умолчанию не будут делать именно то, что вы хотите.

Edit:

Что ж, я пошел дальше и создал для вас свой собственный класс форматирования, так же, как и другие ... не уверен, что я бы порекомендовал вам использовать его в рабочем коде, поскольку для него не будет официальной документации по 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()
...