Как мне отформатировать позиционный аргумент, используя optparse Python?

Как упоминалось в документах и optparse.OptionParser использует IndentedHelpFormatter для вывода отформатированной справки опции, для который я нашел в документации по API .

Я хочу отобразить аналогично отформатированный текст справки для требуемых позиционных аргументов в тексте использования. Есть ли адаптер или простой шаблон использования, который можно использовать для аналогичного форматирования позиционных аргументов?

Пояснение

Предпочтительно только с использованием stdlib. Optparse отлично работает, за исключением одного нюанса форматирования, который, я чувствую, мы должны исправить, не импортируя целые другие пакеты. : -)

25
задан Jonik 24 April 2010 в 17:18
поделиться

4 ответа

Лучший выбор состоял бы в том, чтобы записать патч к optparse модулю. Тем временем можно выполнить это с немного измененным классом OptionParser. Это не прекрасно, но это получит то, что Вы хотите сделанный.

#!/usr/bin/env python
from optparse import OptionParser, Option, IndentedHelpFormatter

class PosOptionParser(OptionParser):
    def format_help(self, formatter=None):
        class Positional(object):
            def __init__(self, args):
                self.option_groups = []
                self.option_list = args

        positional = Positional(self.positional)
        formatter = IndentedHelpFormatter()
        formatter.store_option_strings(positional)
        output = ['\n', formatter.format_heading("Positional Arguments")]
        formatter.indent()
        pos_help = [formatter.format_option(opt) for opt in self.positional]
        pos_help = [line.replace('--','') for line in pos_help]
        output += pos_help
        return OptionParser.format_help(self, formatter) + ''.join(output)

    def add_positional_argument(self, option):
        try:
            args = self.positional
        except AttributeError:
            args = []
        args.append(option)
        self.positional = args

    def set_out(self, out):
        self.out = out
def main():
    usage = "usage: %prog [options] bar baz"
    parser = PosOptionParser(usage)
    parser.add_option('-f', '--foo', dest='foo',
                      help='Enable foo')
    parser.add_positional_argument(Option('--bar', action='store_true',
                                   help='The bar positional argument'))
    parser.add_positional_argument(Option('--baz', action='store_true',
                                   help='The baz positional argument'))
    (options, args) = parser.parse_args()
    if len(args) != 2:
        parser.error("incorrect number of arguments")
    pass

if __name__ == '__main__':
    main()

И вывод Вы добираетесь от выполнения этого:

Usage: test.py [options] bar baz

  Options:
    -h, --help         show this help message and exit
    -f FOO, --foo=FOO  Enable foo

Positional Arguments:
  bar  The bar positional argument
  baz  The baz positional argument
19
ответ дан Douglas Mayle 28 November 2019 в 21:44
поделиться

Попытайтесь смотреть на argparse. В документации говорится, что она поддерживает аргументы положения и более хорошо выглядящие сообщения справки.

8
ответ дан Abhijeet Kasurde 28 November 2019 в 21:44
поделиться

Я интересовался бы чистым решением этого; я не смог придумать тот. OptionParser действительно фокусируется полностью на опциях; это не дает Вам ничего для работы с положением args, насколько я был в состоянии найти.

то, Что я сделал, должно было генерировать список небольших блоков документации для каждого из моих позиционных параметров, с помощью \t с для получения правильного интервала. Тогда я присоединился к ним с новыми строками и добавил это к строке 'использования', которая передается OptionParser.

Это выглядит хорошо, но это чувствует себя глупым, и конечно что документация заканчивает тем, что появилась выше списка опций. Я не нашел пути вокруг этого, или как сделать любой сложный материал, т.е. данный набор опций описан под описанием для позиционного аргумента, потому что они только относятся к тому аргументу

, я посмотрел на методы исправляющего обезьяну OptionParser, и я помню (это было приблизительно одним годом назад), что это не будет настолько трудно, но я не хотел спускаться по тому пути.

1
ответ дан DNS 28 November 2019 в 21:44
поделиться

Большая часть текста справки для позиционных параметров напоминает формат, часто используемый в страницах справочника для *поля NIX. Смотрите на , как команда 'CP' документируется . Ваш текст справки должен напомнить это.

Иначе, пока Вы заполняете аргумент "справки" при использовании синтаксического анализатора, документация должна произвести себя.

0
ответ дан Jon W 28 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: