Контрольное форматирование списка аргументов аргумента argparse?
import argparse
parser = argparse.ArgumentParser(prog='tool')
args = [('-u', '--upf', 'ref. upf', dict(required='True')),
('-s', '--skew', 'ref. skew', {}),
('-m', '--model', 'ref. model', {})]
for args1, args2, desc, options in args:
parser.add_argument(args1, args2, help=desc, **options)
parser.print_help()
Вывод:
usage: capcheck [-h] -u UPF [-s SKEW] [-m MODEL]
optional arguments:
-h, --help show this help message and exit
-u UPF, --upf UPF ref. upf
-s SKEW, --skew SKEW ref. skew
-m MODEL, --model MODEL
ref. model
Как распечатать ref. модель в той же строке, что и -m MODEL, --model MODEL
вместо того, чтобы появляться в отдельной строке, когда я запускаю параметр script с -h
?
Ответы
Ответ 1
Вы можете указать аргумент formatter_class
:
parser = argparse.ArgumentParser(prog='tool',
formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=27))
args = [('-u', '--upf', 'ref. upf', dict(required='True')),
('-s', '--skew', 'ref. skew', {}),
('-m', '--model', 'ref. model', {})]
for args1, args2, desc, options in args:
parser.add_argument(args1, args2, help=desc, **options)
parser.print_help()
Примечание. Реализация argparse.HelpFormatter
является закрытой, только имя является общедоступным. Поэтому код может перестать работать в будущих версиях argparse
. Отправьте запрос функции, чтобы предоставить публичный интерфейс для настройки max_help_position
на http://bugs.python.org/
Выход
usage: tool [-h] -u UPF [-s SKEW] [-m MODEL]
optional arguments:
-h, --help show this help message and exit
-u UPF, --upf UPF ref. upf
-s SKEW, --skew SKEW ref. skew
-m MODEL, --model MODEL ref. model
Ответ 2
Вдохновленный ответом @jfs, я пришел к такому решению:
def make_wide(formatter, w=120, h=36):
"""Return a wider HelpFormatter, if possible."""
try:
# https://stackoverflow.com/a/5464440
# beware: "Only the name of this class is considered a public API."
kwargs = {'width': w, 'max_help_position': h}
formatter(None, **kwargs)
return lambda prog: formatter(prog, **kwargs)
except TypeError:
warnings.warn("argparse help formatter failed, falling back.")
return formatter
Имея это, вы можете позвонить с любого HelpFormatter
, который вам нравится:
parser = argparse.ArgumentParser(
formatter_class=make_wide(argparse.ArgumentDefaultsHelpFormatter)
)
или
parser = argparse.ArgumentParser(
formatter_class=make_wide(argparse.HelpFormatter, w=140, h=20)
)
Что это делает, так это то, что более широкий форматер действительно может быть создан с использованием аргументов width
и max_help_position
. Если закрытый API изменяется, это отмечается make_wide
TypeError
и форматер возвращается без изменений. Это должно сделать код более надежным для развернутых приложений.
Я приветствовал бы любые предложения, чтобы сделать это более питоническим.
Ответ 3
У меня нет python 3, но, глядя на OptionParser
(что очень похоже), я замечаю, что вы можете изменить:
parser.formatter.max_help_position = 50
Это увеличит пространство, зарезервированное для флажков параметров (по умолчанию оно 24)