Подтвердить что ты не робот

Контрольное форматирование списка аргументов аргумента 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?

4b9b3361

Ответ 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)