#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:)