Как избежать использования заглавных букв в модуле argparse в python?

Был вопрос, который спросил, откуда они берутся, и принятым ответом была куча ссылок на учебники и исходный код.Объяснение поведения модуля argparse python: откуда берутся заглавные буквы?

Ничто из этого не помогло мне, я хочу либо избавиться от них, либо узнать их предназначение.

Например, такая строка:

parser.add_argument('-c', '--chunksize', type=int, help='chunk size in bits')

производит мусор, как это:

optional arguments:
  -h, --help            show this help message and exit
  -c CHUNKSIZE, --chunksize CHUNKSIZE
                        chunk size in bits

и если я попытаюсь с пустой строкой метавара:

parser.add_argument('-c', '--chunksize', metavar='', type=int, help='chunk size in bits')

Я получаю пробел после запятой:

optional arguments:
  -h, --help            show this help message and exit
  -c , --chunksize      chunk size in bits
 Nisan.H06 июн. 2013 г., 19:23
Какой ваш желаемый результат?-c chunksize, --chunksize chunksize вместо-c CHUNKSIZE, --chunkesize CHUNKSIZE? Затемmetavar = ('chunksize') сделаю это. Никакой телефонной линии для этого аргумента?help=argparse.SUPPRESS
 mgilson06 июн. 2013 г., 19:24
@ Nisan.H - Я думаю, что OP ищет-c, --chunksize ______ chunksize in bits
 mgilson06 июн. 2013 г., 19:21
я думал такargparse.SUPPRESS может сделать свое дело, но, видимо, нет ...
 mgilson06 июн. 2013 г., 19:23
Для чего этоСтоит, я думаю, что поведение по умолчанию лучше - этоБолее четко о том, какие параметры принимают аргумент (и сколько). Конечно я'Я не пишу программу, поэтому мой вклад здесь может не иметь значения (и этохорошо) - яЯ просто выражаю свои чувства по этому вопросу.
 Nisan.H06 июн. 2013 г., 19:27
Кроме того, посмотрите на MetavarTypeHelpFormatter наdocs.python.org/dev/library/argparse.html#formatter-class и если это неt, вы можете получить исходный код и создать подкласс вашего собственного средства форматирования, чтобы отформатировать вещи так, как вы хотите
 Nisan.H06 июн. 2013 г., 19:44
Я только что заметил, что MetavarTypeHelpFormatter доступен только в версии 3.3 и выше. Я'напишу ответ для кастом форматера.

Ответы на вопрос(2)

Вы можете сделать свой класс форматера для форматирования аргументов любым удобным вам способом. Это'не совсем прямо, но здесьs, который выдает следующий результат (при условии, что @mgilson верен, если вы хотите, чтобы метавар отображался только один раз для набора имен команд ... В противном случае просто укажите фактическийmetavar='value' и он будет отображать именно этот текст.)

# without metavar specified:
-c, --chunksize CHUNKSIZE
                chunk size in bits
# with metavar specified:
-c, --chunksize some_metavar
                chunk size in bits

И код для класса и воспроизведения двух выходных данных:

import argparse
# 2.7-3.2
class SingleMetavarHelpFormatter(argparse.HelpFormatter):
    def _format_action_invocation(self, action):
        if not action.option_strings:
            metavar, = self._metavar_formatter(action, action.dest)(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 = action.dest.upper()
                args_string = self._format_args(action, default)

                ## THIS IS THE PART REPLACED
                #~ for option_string in action.option_strings:
                    #~ parts.append('%s %s' % (option_string, args_string)) ### this is change
                ## /SECTION REPLACED

                ## NEW CODE:
                parts.extend(action.option_strings)
                parts[-1] += ' %s' % args_string
                ## /NEW CODE
            return ', '.join(parts)


parser = argparse.ArgumentParser(
    prog='PROG',
    formatter_class=SingleMetavarHelpFormatter
    )

parser.add_argument('-c', '--chunksize', type=int, help='no metavar specified')
parser.add_argument('-w', '--with_metavar', type=int, help='metavar specified', metavar='some_metavar')

parser.print_help()

редактировать: Чтобы вообще не отображать метавар, вы можете передать пустую строку метавару:

parser.add_argument('-e', '--with_empty_metavar', type=int, help='empty metavar specified', metavar='')

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

#usage: PROG [-h] [-c CHUNKSIZE] [-w some_metavar] [-e]
#
#optional arguments:
#  -h, --help            show this help message and exit
#  -c CHUNKSIZE, --chunksize CHUNKSIZE
#                        no metavar specified
#  -w some_metavar, --with_metavar some_metavar
#                        metavar specified
#  -e, --with_empty_metavar
#                        empty metavar specified
 bug07 июн. 2013 г., 14:39
Но зачем мне этот метавар для начала? Если я смотрю на типичные справочные сообщения в приложениях командной строки Linux, я не вижу эту строку метавара.
 bug10 июн. 2013 г., 12:51
Спасибо, так что я мог написать свой собственный форматер, чтобы сделать эту работу. Я до сих пор нене понимаю, почему это должно быть так громоздко и почему это не такповедение по умолчанию.
 Nisan.H07 июн. 2013 г., 18:47
Если вы передадите пустую строку как метавар, тос, что будет отображаться. Я включил это в редактирование.
 Nisan.H10 июн. 2013 г., 19:01
Без какой-либо конкретной предыстории разработки этого модуля или стандартов сообщений помощи в приложениях командной строки Linux, для меня вполне естественно, что команда, принимающая параметр, отображает некоторый параметр-заполнитель для обозначения своей позиции (а иногда и типа). .. Для чего это стоит, вот почему я так люблю Python - этоОчень легко изменить такое встроенное поведение в соответствии с вашими потребностями.
parser.add_argument('-c', '--chunksize', metavar='\b', type=int, help='chunk size in bits')

похоже на работу

 bug07 июн. 2013 г., 14:41
Аккуратный хак, лол. Я могу'не верю в этоЭто правильный способ сделать это.
 user194884704 июн. 2014 г., 16:35
Это испортит отступ описания опции
 Aravind10 июн. 2013 г., 17:35
ты сказал это сам; это взломать так можетэто будет правильный путь, лол

Ваш ответ на вопрос