Argparse: Способ включения значений по умолчанию в '--help'?
Предположим, у меня есть следующий фрагмент argparse:
diags.cmdln_parser.add_argument( '--scan-time',
action = 'store',
nargs = '?',
type = int,
default = 5,
help = "Wait SCAN-TIME seconds between status checks.")
В настоящее время --help
возвращает:
usage: connection_check.py [-h]
[--version] [--scan-time [SCAN_TIME]]
Test the reliability/uptime of a connection.
optional arguments:
-h, --help show this help message and exit
--version show program version number and exit
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
Я бы предпочел что-то вроде:
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
(Default = 5)
Посмотрев на кодировщик справки, код показал ограниченные возможности. Есть ли умный способ заставить argparse
печатать значение по умолчанию для --scan-time
подобным образом, или я должен просто создать подкласс help
форматирования help
?
Ответы
Ответ 1
Используйте форматтер argparse.ArgumentDefaultsHelpFormatter
:
parser = argparse.ArgumentParser(
# ... other options ...
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
Цитировать документацию:
Другой доступный класс форматера, ArgumentDefaultsHelpFormatter
, добавит информацию о значении по умолчанию для каждого из аргументов.
Обратите внимание, что это относится только к аргументам, для которых задан текст справки; без значения help
для аргумента, нет примечания для добавления информации.
Точный вывод для вашего параметра времени сканирования становится следующим:
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
(default: 5)
Ответ 2
Добавьте '%(default)'
в параметр справки, чтобы управлять отображаемым.
parser.add_argument("--type", default="toto", choices=["toto","titi"],
help = "type (default: %(default)s)")
Ответ 3
Класс Wrapper
Это самый надежный и СУХОЙ подход, который я обнаружил до сих пор, чтобы одновременно показывать значения по умолчанию и использовать другой форматер, такой как argparse.RawTextHelpFormatter
:
#!/usr/bin/env python3
import argparse
class ArgumentParserWithDefaults(argparse.ArgumentParser):
def add_argument(self, *args, help=None, default=None, **kwargs):
if help is not None:
kwargs['help'] = help
if default is not None and args[0] != '-h':
kwargs['default'] = default
if help is not None:
kwargs['help'] += ' Default: {}'.format(default)
super().add_argument(*args, **kwargs)
parser = ArgumentParserWithDefaults(
formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.add_argument('--no-default', help='''my help
for no-default''')
parser.add_argument('--no-help', default=101)
parser.print_help()
print()
print(parser.parse_args())
Выход:
usage: main.py [-h] [-a A] [-b B] [--no-default NO_DEFAULT]
[--no-help NO_HELP]
optional arguments:
-h, --help show this help message and exit
-a A my help
for a Default: 13
-b B my help
for b Default: 42
--no-default NO_DEFAULT
my help
for no-default
--no-help NO_HELP
Namespace(a=13, b=42, no_default=None, no_help=101)
ArgumentDefaultsHelpFormatter
+ RawTextHelpFormatter
множественное наследование
Множественное наследование просто работает, но оно не является публичным API:
#!/usr/bin/env python3
import argparse
class RawTextArgumentDefaultsHelpFormatter(
argparse.ArgumentDefaultsHelpFormatter,
argparse.RawTextHelpFormatter
):
pass
parser = argparse.ArgumentParser(
formatter_class=RawTextArgumentDefaultsHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.print_help()
Выход:
usage: a.py [-h] [-a A] [-b B]
optional arguments:
-h, --help show this help message and exit
-a A my help
for a (default: 13)
-b B my help
for b (default: 42)
Это просто работает работает, потому что, как мы можем легко увидеть из источников https://github.com/python/cpython/blob/v3.6.5/Lib/argparse.py#L648, что:
-
RawTextHelpFormatter
реализует _split_lines
-
ArgumentDefaultsHelpFormatter
реализует _get_help_string
так что мы можем догадаться, что они будут отлично работать вместе.
Тем не менее, это не похоже на публичный API, как и методы formatter_class
, поэтому я не думаю, что в настоящее время существует публичный способ API сделать это. argparse
docstring говорит:
Все остальные классы в этом модуле считаются деталями реализации. (Также обратите внимание, что HelpFormatter и RawDescriptionHelpFormatter считаются открытыми только как имена объектов - API объектов форматирования все еще считается деталью реализации.)
Смотрите также: Настройка сообщения помощи argparse
Проверено на Python 3.6.5.
Ответ 4
Для Optparser
по Optparser
в Python нет default
по default
.
Тем не менее, вы можете использовать следующие -
# show help as default
if len(sys.argv) == 1:
os.system("python " + sys.argv[0] + " -h")
exit()
Это будет работать один и тот же сценарий с -h
вариант, и exit
.
Обратите внимание - вам нужно будет import os, sys
модули import os, sys
чтобы использовать эту опцию.