Как мне отформатировать позиционный аргумент, используя optparse в Python?
Как уже упоминалось в документах optparse.OptionParser
использует IndentedHelpFormatter
вывести отформатированную опцию справки, для которой я нашел некоторую документацию по API.
Я хочу отобразить аналогично отформатированный текст справки для требуемых позиционных аргументов в тексте использования. Есть ли адаптер или простой шаблон использования, который можно использовать для аналогичного форматирования позиционных аргументов?
осветление
Желательно только с использованием stdlib. Optparse отлично работает, за исключением одного нюанса форматирования, который, я чувствую, мы должны исправить, не импортируя целые другие пакеты.:-)
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
Попробуйте взглянуть на argparse. Документация говорит, что она поддерживает аргументы позиции и более приятные сообщения справки.
Я был бы заинтересован в чистом решении этого; Я не смог придумать один. OptionParser действительно полностью фокусируется на опциях; насколько мне удалось найти, это ничего не дает для работы с позиционными аргументами.
Я создал список небольших блоков документации для каждого из моих позиционных аргументов, используя \t
s, чтобы получить правильный интервал. Затем я соединил их с символами новой строки и добавил их в строку "использования", которая передается в OptionParser.
Выглядит хорошо, но выглядит глупо, и, конечно, эта документация заканчивается над списком опций. Я не нашел никакого способа обойти это, или как делать какие-то сложные вещи, т.е. данный набор опций описан ниже описания для позиционного аргумента, потому что они применяются только к этому аргументу.
Я посмотрел на методы OptionParser, исправляющие обезьяны, и помню (это было около года назад), что это не было бы так сложно, но я не хотел идти по этому пути.
Большая часть справочного текста для позиционных аргументов напоминает формат, часто используемый на страницах руководства для блоков *NIX. Посмотрите, как задокументирована команда 'cp'. Ваш текст помощи должен напоминать это.
В противном случае, пока вы заполняете аргумент "help" при использовании парсера, документация должна генерироваться сама собой.