Wie formatiere ich Positions Argument Hilfe Pythons optparse mit?
-
22-07-2019 - |
Frage
Wie in die Dokumentation die optparse.OptionParser
verwendet einen IndentedHelpFormatter
zur Ausgabe des formatierten Option Hilfe, für die die ich einige API-Dokumentation .
Ich mag für die erforderlichen, Positions Argumente in dem Nutzungs Text einen ähnlich formatierte Hilfetext angezeigt werden soll. Gibt es einen Adapter oder ein einfaches Nutzungsmuster, die für ähnliche Positions Argument Formatierung verwendet werden können?
Klarstellung
Vorzugsweise wird nur die stdlib verwenden. Optparse tut große Ausnahme für diese eine Formatierung Nuance, die ich fühle mich wie wir ohne sie zu importieren ganz andere Pakete zu beheben sollten in der Lage. : -)
Lösung
Der beste Weg wäre, einen Patch auf die optparse Modul zu schreiben. In der Zwischenzeit können Sie dies mit einer leicht modifizierten OptionParser Klasse erreichen. Dies ist nicht perfekt, aber es bekommen, was Sie erreichen 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 vom Laufen dieser:
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
Andere Tipps
Versuchen Sie, einen Blick auf argparse . Dokumentation sagt Position Argument und schönere Hilfenachricht unterstützt.
würde ich in eine saubere Lösung dieses Problems interessiert sein; Ich war nicht in der Lage, mit einem zu kommen. Die OptionParser wirklich konzentriert sich ganz auf die Optionen; es nicht geben Sie etwas mit Position args zu arbeiten, soweit ich feststellen konnte ich zu.
Was ich tat, war eine Liste mit wenig Dokumentation Blöcke für jeden meiner Positionsargumente zu erzeugen, indem \t
s den richtigen Abstand zu bekommen. Dann trat ich sie mit Zeilenumbrüchen und die beigefügten, dass auf die ‚Verwendung‘ String, der den OptionParser übergeben wird.
Es sieht gut aus, aber es fühlt sich dumm und selbstverständlich, dass die Dokumentation endet oberhalb der Liste der Optionen erscheinen auf. Ich habe keine Möglichkeit um das gefunden, oder, wie man jede komplexe Dinge zu tun, das heißt eine bestimmte Reihe von Optionen unter der Beschreibung für eine Positions arg beschrieben wird, weil sie nur auf diese arg gelten.
schaute ich auf Affe-Patchen OptionParser Methoden und ich erinnere mich (dies war ein Jahr oder so vor), dass es nicht so schwierig gewesen wäre, aber ich wollte nicht, diesen Weg zu gehen.
Die meisten Hilfetext für Positionsargumente ähnelt das Format häufig in Manpages * NIX-Boxen verwendet. Schauen Sie sich auf , wie der Befehl ‚cp‘ dokumentiert. Ihr Hilfetext soll, dass ähneln.
Ansonsten solange Sie das „Hilfe“ Argument ausfüllen, während der Parser, die Dokumentation sollte selbst produzieren.