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

27

文档中提到的,optparse.OptionParser使用IndentedHelpFormatter输出格式化选项帮助信息。我找到了一些API文档

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

澄清

最好只使用标准库。Optparse很棒,只是这一个格式化细节不尽人意。我觉得我们应该能够在不导入整个其他软件包的情况下解决它。 :-)


这真是太遗憾了,我现在也遇到了同样的问题。 - Matt Joiner
4个回答

20

最好的办法是编写一个用于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

这非常棒。不过有一个小问题:您能否检测用户是否设置了用法并使用默认值,如果可以,请将位置参数添加到使用消息中? - UlfR
2
我建议你看一下argparse模块...它足够小,可以嵌入到任何项目中,并且可以执行与此代码相同的操作以及更多操作... - Douglas Mayle

8
尝试查看argparse。文档显示它支持位置参数和更漂亮的帮助信息。

1
谢谢你的指针,但如果可能的话,我更愿意使用stdlib。这似乎不是一个需要下载和捆绑整个其他选项包来解决的难题。 - cdleary
2
argparse 在 2.7 标准库中。 - fmark

1

我对这个问题很感兴趣,但是我无法想出一个干净的解决方案。OptionParser真正关注的是选项;就我所知,它没有提供任何有关位置参数的内容。

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

看起来还不错,但感觉有些愚蠢,当然,该文档最终出现在选项列表上面。我没有找到任何方法来解决这个问题,或者如何进行复杂的操作,例如在位置参数的描述下面描述一组给定的选项,因为它们仅适用于该参数。

我曾经尝试过猴子补丁OptionParser的方法,我记得(大约一年前)那并不难,但我不想走这条路。


是的,我对排序没问题,但我的使用文本为位置参数命名,我希望在“参数”和“选项”部分中,名称-说明对看起来相同。 - cdleary

0

大多数关于位置参数的帮助文本都类似于*NIX系统中man页面经常使用的格式。看一下'cp'命令如何记录文档。你的帮助文本应该与此类似。

否则,只要在使用解析器时填写“help”参数,文档就会自动生成。


除非我漏掉了什么重要的东西,否则您无法为位置参数指定帮助。我希望它看起来就像生成的“选项”部分一样。我认为手动格式化很愚蠢,所以如果不存在这样的功能,我可能会编写一些代码来自动完成它。 - cdleary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接