Wie sollte ich Sie umsetzen "nested" - Unterbefehle, die in Python?
Durchführung "nested" - Unterbefehle, die in Python mit cmdln.
Ich bin mir nicht sicher, ich verwende die richtige Terminologie hier. Ich versuche zu implementieren ist ein commandline-tool mit cmdln, der es ermöglicht, "nested" - Unterbefehle. Hier ist ein reales Beispiel:
git svn rebase
Was ist der beste Weg für die Umsetzung dieser? Ich habe die Suche nach mehr Informationen über dieses in der doc, hier und im web zu groß ist, aber haben gehen leer aus. (Vielleicht war ich Suche mit den falschen Begriffen.)
Kurzen der eine nicht dokumentierte Funktion, die dies automatisch erledigt, mein Erster Gedanke war, haben die früheren subcommand-handler bestimmen, dass es ein anderes subkommando und Versand der command dispatcher wieder. Ich habe schaute auf die Interna von cmdln aber und der dispatcher ist eine private Methode, _dispatch_cmd. Mein Nächster Gedanke ist, um meine eigene sub-sub-command dispatcher, aber das scheint weniger als ideal und chaotisch.
Jede mögliche Hilfe würde geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
argparse macht sub-Befehle sehr einfach.
Spät zur party hier, aber ich habe hierzu etwas gefunden haben
argparse
ziemlich klobig, dies zu tun mit. Dies motiviert mich, zu schreiben, eine Erweiterungargparse
genannt arghandler, die explizit Unterstützung für diese Entscheidungen möglich umzusetzen-Unterbefehle, die mit im Grunde null Zeilen code.Hier ein Beispiel:
Ich das Gefühl, es gibt eine leichte Einschränkung mit sub_parsers in argparse, wenn Sie sagen, Sie haben eine suite von tools, die möglicherweise haben ähnliche Optionen, die möglicherweise verteilt auf verschiedene Ebenen. Es könnte sein, selten zu dieser situation, aber wenn Sie schreiben, Steck - /modular-code, es könnte passieren.
Habe ich Folgendes Beispiel. Es ist weit hergeholt und nicht gut erklärt im moment, weil es schon spät ist, aber hier geht es:
Ausgabe
Wie Sie sehen können, ist es schwer zu unterscheiden, wo entlang der Kette jedes argument gesetzt wurde.
Man könnte dieses Problem lösen, indem Sie den Namen für jede variable. Sie könnten zum Beispiel festlegen, 'dest' zu 'x', 'a_x', 'a_create_x', 'b_push_x', etc., aber das wäre zu schmerzhaft und schwer zu trennen.
Wäre eine alternative haben die ArgumentParser Stoppt, sobald es erreicht einen Unterbefehl, und übergeben Sie die restlichen Argumente aus zu einem anderen, unabhängigen parser, so könnte es erzeugt separate Objekte.
Sie können versuchen, zu erreichen, dass durch die Verwendung von 'parse_known_args()' und nicht definieren Argumente für jedes subkommando. Das wäre aber nicht gut, weil alle un-analysiert die Argumente aus, bevor Sie würde immer noch dort sein und kann das Programm verwirren.
Fühle ich mich etwas Billig, aber nützlich Abhilfe ist argparse interpretieren Sie die folgenden Argumente als strings in einer Liste. Dies kann durch die Einstellung des Präfix zu einem null-terminator '\0' (oder einige andere "hard-to-use' - Zeichen) - wenn der Präfix ist leer, und der code wirft einen Fehler, zumindest in Python-2.7.3.
Beispiel:
Ausgabe:
Beachten Sie, dass Sie nicht verbrauchen die zweite
-y
option.Sie können dann das Ergebnis "args" anderen ArgumentParser.
Nachteile:
Wenn jemand mehr input auf dieser, lassen Sie es mich bitte wissen.