如何使用Python的optparse格式化位置参数帮助?

2024-04-27 05:30:57 发布

您现在位置:Python中文网/ 问答频道 /正文

the docs中所述,optparse.OptionParser使用IndentedHelpFormatter输出格式化选项帮助,为此我找到了一些API documentation

我想在用法文本中为所需的位置参数显示类似格式的帮助文本。是否有适配器或简单的使用模式可用于类似的位置参数格式?

澄清

最好只使用stdlib。Optparse做得很好,除了这一个格式上的细微差别,我觉得我们应该能够修复,而不必导入整个其他包。:-)


Tags: the文本apidocs用法参数documentation格式
3条回答

我想找个干净的办法解决这个问题,但我没能想出一个。OptionParser实际上完全专注于选项;就我所能找到的而言,它并没有提供任何可以使用位置参数的东西。

我所做的是为每个位置参数生成一个小文档块列表,使用\ts获得正确的间距。然后我用新行将它们连接起来,并将其附加到传递给OptionParser的“usage”字符串中。

它看起来不错,但感觉很傻,当然,文档最终出现在选项列表的上方。我还没有找到解决这个问题的方法,也没有找到如何做任何复杂的事情的方法,即在位置arg的描述下面描述一组给定的选项,因为它们只适用于该arg。

我看了monkey patching OptionParser的方法,我记得(这是一年前的事)这不会有那么困难,但我不想走这条路。

最好的办法是给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。文档说明它支持位置参数和更美观的帮助消息。

相关问题 更多 >