27 Stimmen

Wie formatiere ich die Hilfe für Positionsargumente mit Pythons optparse?

Wie bereits in les docs die optparse.OptionParser verwendet eine IndentedHelpFormatter um die formatierte Optionshilfe auszugeben, wofür ich einige API-Dokumentation .

Ich möchte einen ähnlich formatierten Hilfetext für die erforderlichen Positionsargumente anzeigen im Gebrauchstext. Gibt es einen Adapter oder ein einfaches Verwendungsmuster, das für eine ähnliche Formatierung von Positionsargumenten verwendet werden kann?

Klärung

Vorzugsweise nur unter Verwendung der stdlib. Optparse ist großartig, bis auf diese eine Formatierungsnuance, von der ich denke, dass wir in der Lage sein sollten, sie zu beheben, ohne ganze andere Pakete zu importieren :-)

20voto

Douglas Mayle Punkte 19645

Am besten wäre es, einen Patch für das optparse-Modul zu schreiben. In der Zwischenzeit können Sie dies mit einer leicht modifizierten OptionParser-Klasse erreichen. Das ist zwar nicht perfekt, aber es bringt das, was Sie wollen.

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

Und die Ausgabe, die Sie erhalten, wenn Sie dies ausführen:

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

8voto

Richard Levasseur Punkte 13763

Werfen Sie einen Blick auf argparse . In der Dokumentation heißt es, dass es Positionsargumente und schönere Hilfemeldungen unterstützt.

1voto

DNS Punkte 35625

Ich wäre an einer sauberen Lösung für dieses Problem interessiert; ich war nicht in der Lage, mit einem zu kommen. Die OptionParser wirklich konzentriert sich ganz auf die Optionen; es gibt Ihnen nichts, mit Position args zu arbeiten, soweit ich in der Lage gewesen zu finden.

Ich habe eine Liste von kleinen Dokumentationsblöcken für jedes meiner Positionsargumente erstellt, indem ich \t s, um die richtigen Abstände zu erhalten. Dann habe ich sie mit Zeilenumbrüchen verbunden und an die Zeichenkette "usage" angehängt, die an den OptionParser übergeben wird.

Es sieht gut aus, aber es fühlt sich albern an, und natürlich erscheint die Dokumentation am Ende über der Liste der Optionen. Ich habe keine Möglichkeit gefunden, das zu umgehen oder komplexe Dinge zu tun, d.h. ein bestimmter Satz von Optionen wird unterhalb der Beschreibung für ein Positionsarg beschrieben, weil sie nur für dieses Arg gelten.

Ich habe mir die Methoden von monkey-Parcheando OptionParser angesehen und ich erinnere mich (das war vor einem Jahr oder so), dass es nicht so schwierig gewesen wäre, aber ich wollte diesen Weg nicht gehen.

0voto

Jon W Punkte 14908

Der meiste Hilfetext für Positionsargumente ähnelt dem Format, das häufig in Manpages für *NIX-Boxen verwendet wird. Werfen Sie einen Blick auf wie der Befehl "cp" dokumentiert ist . Ihr Hilfetext sollte diesem ähneln.

Andernfalls sollte sich die Dokumentation von selbst erstellen, wenn Sie bei der Verwendung des Parsers das Argument "help" ausfüllen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X