Ich benutze argparse
in Python 2.7 zum Parsen von Eingabeoptionen. Eine meiner Optionen ist eine Multiple-Choice-Option. Ich möchte eine Liste in seinem Hilfetext erstellen, z
from argparse import ArgumentParser
parser = ArgumentParser(description='test')
parser.add_argument('-g', choices=['a', 'b', 'g', 'd', 'e'], default='a',
help="Some option, where\n"
" a = alpha\n"
" b = beta\n"
" g = gamma\n"
" d = delta\n"
" e = epsilon")
parser.parse_args()
argparse
Entfernt jedoch alle Zeilenumbrüche und aufeinander folgenden Leerzeichen. Das Ergebnis sieht aus wie
~ / Downloads: 52 $ python2.7 x.py -h Verwendung: x.py [-h] [-g {a, b, g, d, e}] Prüfung optionale Argumente: -h, --help Diese Hilfemeldung anzeigen und beenden -g {a, b, g, d, e} Eine Option, bei der a = alpha b = beta g = gamma d = delta e = Epsilon
Wie füge ich Zeilenumbrüche in den Hilfetext ein?
argparse
nicht dem Interpreter durchgeführt, daher"""..."""
hilft das Umschalten auf nicht.Antworten:
Versuchen Sie es mit
RawTextHelpFormatter
:quelle
Only the name of this class is considered a public API. All the methods provided by the class are considered an implementation detail.
wahrscheinlich keine großartige Idee, obwohl es möglicherweise keine Rolle spielt, da 2.7 die letzte 2.x-Python sein soll und Sie ohnehin viele Dinge für 3.x umgestalten müssen. Ich verwende tatsächlich 2.6 mitargparse
installiertem Via,easy_install
damit die Dokumentation selbst möglicherweise veraltet ist.RawDescriptionHelpFormatter
das nur für Beschreibung und Epilog und nicht für Hilfetext funktioniert.RawTextHelpFormatter
, führende und nachfolgende Zeilenumbrüche entfernt werden. Um dies zu umgehen, können Sie einfach zwei oder mehr aufeinanderfolgende Zeilenumbrüche hinzufügen. Alle bis auf eine Newline werden überleben.class Formatter( argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter): pass
und dannformatter_class=Formatter
.Wenn Sie nur die eine Option überschreiben möchten, sollten Sie sie nicht verwenden
RawTextHelpFormatter
. Unterklasse stattdessenHelpFormatter
und bieten ein spezielles Intro für die Optionen, die "roh" behandelt werden sollen (ich benutze"R|rest of help"
):Und benutze es:
Alle anderen Anrufe, bei
.add_argument()
denen die Hilfe nicht beginnt,R|
werden wie gewohnt verpackt.Dies ist Teil meiner Verbesserungen bei Argparse . Der vollständige SmartFormatter unterstützt auch das Hinzufügen der Standardeinstellungen zu allen Optionen und die Roheingabe der Dienstprogrammbeschreibung. Die Vollversion verfügt über eine eigene
_split_lines
Methode, sodass alle Formatierungen, z. B. für Versionszeichenfolgen, beibehalten werden:quelle
parser.add_argument('-v', '--version', action='version',version=get_version_str())
Ist es möglich, es auf diesen Fall auszudehnen?_split_lines
und behält Zeilenumbrüche bei (keine Notwendigkeit, "R |" am Anfang anzugeben, wenn Sie diese Option wünschen, patchen Sie die_VersionAction.__call__
Methode_VersionAction.__call__
dass ich es wahrscheinlich nur wollen würde,parser.exit(message=version)
anstatt die formatierte Version zu verwenden. Gibt es eine Möglichkeit, dies zu tun, ohne eine gepatchte Kopie von argparse zu veröffentlichen?__call__
in_VersionAction
indem Sieargparse._VersionAction.__call__ = smart_version
nach der Definitiondef smart_version(self, parser, namespace, values, option_string=None): ...
Eine andere einfache Möglichkeit besteht darin, Textwrap einzuschließen .
Zum Beispiel,
Auf diese Weise können wir den langen leeren Raum vor jeder Ausgabezeile vermeiden.
quelle
Ich habe ein ähnliches Problem (Python 2.7.6). Ich habe versucht, den Beschreibungsabschnitt in mehrere Zeilen zu unterteilen, indem ich
RawTextHelpFormatter
:Und bekam:
Ist
RawTextHelpFormatter
also keine Lösung. Da die Beschreibung so gedruckt wird, wie sie im Quellcode angezeigt wird, werden alle Leerzeichen beibehalten (ich möchte aus Gründen der Lesbarkeit zusätzliche Registerkarten in meinem Quellcode behalten, aber nicht alle drucken. Auch der Rohformatierer umbricht keine Zeile, wenn dies der Fall ist zu lang, zum Beispiel mehr als 80 Zeichen).Vielen Dank an @Anton, der die richtige Richtung oben inspiriert hat . Diese Lösung muss jedoch geringfügig geändert werden, um die Beschreibung zu formatieren .
Auf jeden Fall wird ein benutzerdefinierter Formatierer benötigt. Ich habe die vorhandene
HelpFormatter
Klasse erweitert und die_fill_text
Methode wie folgt überschrieben :Vergleichen Sie mit dem ursprünglichen Quellcode aus dem argparse- Modul:
Im Originalcode wird die gesamte Beschreibung verpackt. Im obigen benutzerdefinierten Formatierer wird der gesamte Text in mehrere Abschnitte aufgeteilt und jeder von ihnen wird unabhängig formatiert.
Also mit Hilfe eines benutzerdefinierten Formatierers:
Die Ausgabe ist:
quelle
HelpFormatter
sind problematisch, da die Argparse-Entwickler nur garantieren, dass der Klassenname in zukünftigen Versionen von Argparse überlebt. Sie haben sich im Grunde genommen einen Blankoscheck ausgestellt, damit sie die Methodennamen ändern können, wenn dies für sie zweckmäßig wäre. Ich finde das frustrierend; Das Mindeste, was sie hätten tun können, sind einige Methoden in der API.Ich wollte sowohl manuelle Zeilenumbrüche im Beschreibungstext als auch einen automatischen Zeilenumbruch. Aber keiner der Vorschläge hier hat für mich funktioniert. Daher habe ich die SmartFormatter-Klasse geändert, die in den Antworten hier angegeben ist. Obwohl die Probleme mit den Namen der argparse-Methode keine öffentliche API sind, habe ich Folgendes (als Datei mit dem Namen
test.py
):So funktioniert es in 2.7 und 3.4:
quelle
Ausgehend von dem oben beschriebenen SmartFomatter endete ich mit dieser Lösung:
Beachten Sie, dass das an den Parser der obersten Ebene übergebene Argument formatter_class seltsamerweise nicht von sub_parsers geerbt wird. Es muss für jeden erstellten sub_parser erneut übergeben werden.
quelle
Vorwort
Für diese Frage
argparse.RawTextHelpFormatter
ist mir hilfreich.Jetzt möchte ich mitteilen, wie ich das verwende
argparse
.Ich weiß, dass es möglicherweise nicht mit Fragen zusammenhängt,
Aber diese Fragen haben mich eine Weile beschäftigt.
Ich möchte meine Erfahrungen teilen und hoffe, dass dies für jemanden hilfreich ist.
Auf geht's.
Module von Drittanbietern
colorama : zum Ändern der Textfarbe :
pip install colorama
Beispiel
Wo die Klasse von
FormatText
ist die folgendequelle