How do I format positional argument help using Python's optparse?

后端 未结 4 1257
刺人心
刺人心 2021-02-02 09:57

As mentioned in the docs the optparse.OptionParser uses an IndentedHelpFormatter to output the formatted option help, for which which I found some API

相关标签:
4条回答
  • 2021-02-02 10:34

    Most help text for positional arguments resembles the format frequently used in man pages for *NIX boxes. Take a look at how the 'cp' command is documented. Your help text should resemble that.

    Otherwise as long as you fill out the "help" argument while using the parser, the documentation should produce itself.

    0 讨论(0)
  • 2021-02-02 10:36

    I'd be interested in a clean solution to this; I wasn't able to come up with one. The OptionParser really focuses entirely on the options; it doesn't give you anything to work with position args, as far as I've been able to find.

    What I did was to generate a list of little documentation blocks for each of my positional arguments, using \ts to get the right spacing. Then I joined them with newlines, and appended that to the 'usage' string that gets passed to the OptionParser.

    It looks fine, but it feels silly, and of course that documentation ends up appearing above the list of options. I haven't found any way around that, or how to do any complex stuff, i.e. a given set of options is described beneath the description for a positional arg, because they only apply to that arg.

    I looked at monkey-patching OptionParser's methods and I remember (this was a year or so ago) that it wouldn't have been that difficult, but I didn't want to go down that path.

    0 讨论(0)
  • 2021-02-02 10:37

    Try taking a look at argparse. Documentation says it supports position arguments and nicer looking help messages.

    0 讨论(0)
  • 2021-02-02 10:56

    The best bet would be to write a patch to the optparse module. In the meantime, you can accomplish this with a slightly modified OptionParser class. This isn't perfect, but it'll get what you want done.

    #!/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()
    

    And the output you get from running this:

    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
    
    0 讨论(0)
提交回复
热议问题