Подавление повторяющихся записей в сгенерированном argaparse тексте «справка»

#python #argparse

Вопрос:

Мой вопрос заключается в том, как подавить или изменить некоторый автоматически сгенерированный текст в выводе argaparse при использовании -h аргумента для отображения справки. Проблема, с которой я сталкиваюсь, заключается в том, что появляется несколько нежелательных и повторяющихся записей. Моя причина, по которой я спрашиваю здесь, заключается в том, что я не могу найти объяснение в документации Python и argaparse, которое объясняет мне, почему появляется этот текст и как от него избавиться.

У меня есть небольшой скрипт под названием «sbucalc», который включает в себя следующие строки кода:

 parser=argparse.ArgumentParser('calculates the NWO initial grant and the RCCS credits for a given amount of SBU', usage='sbucalc [-h][--nwo INITIAL PERCENT] [--rccs SBU RATE]')
parser.add_argument('--nwo', nargs=' ', help='--nwo INITIAL_GRANT [PERCENT] default=10')
parser.add_argument('--rccs', nargs=' ',  help='--rccs SBU [RATE] default=1.14')
parser.print_help
 

Что я получаю, когда выполняю sbucalc -h , так это:

 usage: calculates the NWO initial grant and the RCCS credits for a given amount of SBU [-h][--nwo INITIAL PERCENT] [--rccs SBU RATE]

optional arguments:
  -h, --help            show this help message and exit
  --nwo NWO [NWO ...]   --nwo INITIAL_GRANT [PERCENT] default=10
  --rccs RCCS [RCCS ...]
                        --rccs SBU [RATE] default=1.14
 

Я, кажется, не нахожу способа подавить эти первые примеры --nwo NWO [NWO...] желаемого результата, который должен быть:

 usage: calculates the NWO initial grant and the RCCS credits for a given amount of SBU [-h][--nwo INITIAL PERCENT] [--rccs SBU RATE]

optional arguments:
  -h, --help            show this help message and exit
  --nwo INITIAL_GRANT [PERCENT] default=10
  --rccs SBU [RATE] default=1.14
 

Есть ли способ достичь этого?

П. Д.: Я понимаю, почему термин «помощь» нельзя использовать в названии, но когда ваш вопрос касается чертова вывода сообщения о помощи, это ограничение на самом деле не то, что вы хотите иметь.

Комментарии:

1. Они вызваны nargs=' ' тем, что допускает одно или несколько значений для аргумента.

2. Чтобы повторить комментарий Клауса: если вы хотите разрешить несколько начальных значений гранта, используйте » «. Дополнительный [NWO …] предназначен для того, чтобы помочь пользователю указать, что разрешено несколько значений гранта. Если вы хотите использовать только одно значение, установите nargs значение 1 (или не используйте его и оставьте его по умолчанию). То же самое, конечно, касается rcc. Если вы хотите еще что-то другое, пожалуйста, укажите это в своем вопросе.

3. Левая колонка автоматически генерируется. Вы можете настроить его с metavar помощью параметра, но не устранять его. Перепишите текст справки с учетом этого. Все остальное требует подклассного форматирования справки.

4. Для argparse вопросов мы хотели бы видеть примеры командной строки(ов) и желаемый args результат. Другими словами, то, что вы анализируете, так же важно, если не более, чем формат справки.

Ответ №1:

Похоже, что вы ищете что-то вроде

 import argparse

parser=argparse.ArgumentParser(
    description='calculates the NWO initial grant and the RCCS credits for a given amount of SBU',
    usage='sbucalc [-h] [--nwo INITIAL PERCENT] [--rccs SBU RATE]')
parser.add_argument(
    '--nwo', dest='initial_grant', nargs=1, help='[PERCENT] default=10')
parser.add_argument(
    '--rccs', dest='sbu', nargs=1, help='[RATE] default=1.14')
parser.print_help()
 

Это приводит к

 usage: sbucalc [-h] [--nwo INITIAL PERCENT] [--rccs SBU RATE]

calculates the NWO initial grant and the RCCS credits for a given amount of
SBU

optional arguments:
  -h, --help           show this help message and exit
  --nwo INITIAL_GRANT  [PERCENT] default=10
  --rccs SBU           [RATE] default=1.14
 

Обратите внимание, как называются переменные, чтобы в сообщении справки содержалось описательное имя, которое, как вы говорите, вам нужно, и как я изменил nargs=' ' — что, по — видимому, вы все равно здесь не хотели-на nargs=1 которое указывает параметр как необязательный. (Это оксюморонно, и, как правило, его следует избегать. Если аргумент не является необязательным, сделайте его обязательным аргументом, хотя, возможно, с возможностью альтернативного указания его в качестве опции. nargs='?' делает это.)

О, и я добавил отсутствующее description ключевое слово, чтобы включить описание в вывод.

… Хотя, если вы действительно хотите, чтобы значение по умолчанию было установлено, эти параметры не должны быть обязательными, и вы должны использовать default ключевое слово, чтобы указать фактическое значение по умолчанию.

 parser=argparse.ArgumentParser(
    description='calculates the NWO initial grant and the RCCS credits for a given amount of SBU',
    usage='sbucalc [options]',
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument(
    '--nwo', dest='initial_grant', default=10, help='[PERCENT]')
parser.add_argument(
    '--rccs', dest='sbu', default=1.14, help='[RATE]')
 

какие отпечатки

 usage: sbucalc [-h] [options]

calculates the NWO initial grant and the RCCS credits for a given amount of
SBU

optional arguments:
  -h, --help           show this help message and exit
  --nwo INITIAL_GRANT  [PERCENT] (default: 10)
  --rccs SBU           [RATE] (default: 1.14)
 

(Обратите внимание также на formatter_class аргумент инициализатора.)

Указание параметров в usage сообщении на самом деле просто добавляет больше дублирования и создает дополнительные проблемы с обслуживанием; лучше всего, чтобы пользователь просто ссылался на список опций ниже и сохранял простой usage='sbucalc [options]' или что-то в этом роде, как я делаю здесь.

(Наконец, обратите внимание также, как вы забыли круглые скобки вокруг print_help() вызова функции.)

Комментарии:

1. Спасибо! Вся цель приведенного выше кода на самом деле состояла в том, чтобы научиться использовать argparse, это не производственный код или что-то подобное. Итак, в качестве упражнения я пытаюсь переписать несколько простых скриптов bash на Python. Но я действительно увяз в документации. Кстати, скобки в функции print() есть в оригинале, клянусь 0:)