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

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

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

Разъяснение

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

Ответы [ 4 ]

19 голосов
/ 20 марта 2009

Лучше всего написать патч для модуля 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
8 голосов
/ 13 марта 2009

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

1 голос
/ 13 марта 2009

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

Я создал список небольших блоков документации для каждого из моих позиционных аргументов, используя \t s, чтобы получить правильный интервал. Затем я соединил их с символами новой строки и добавил их в строку «использования», которая передается в OptionParser.

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

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

0 голосов
/ 13 марта 2009

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

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

...