2012-12-27 4 views
6

Mein Ziel ist es, ein Python-Befehlszeilen-Dienstprogramm mit argparse schreiben, die mehrere Befehle hat, die jeweils verschiedene Sätze von erforderlichen Eingaben haben.Python und argparse: wie erforderliche zusätzliche Argumente basierend auf dem ersten Argument variieren?

Ich habe versucht, durch die Dokumente zu lesen, ein paar Google-Suchen und Stapelüberlauf und konnte nichts finden. Ich kann mir einige mögliche Lösungen vorstellen, aber sie sind hässlich und erfordern die manuelle Handhabung der Hilfedokumente und Validierung. Mein Verdacht ist, dass dies die Art von Problem mit einer gemeinsamen, effektiven Lösung ist, die bereits gut genug bekannt ist, und mir fehlen einfach die richtigen Bedingungen, um danach zu suchen, oder sie ist mit einem kleinen Vorsprung obskur genug, dass sie nicht veröffentlicht wird viele Orte.

Die beste Idee, die ich gerade habe, ist, ein Positionsargument zu haben, und irgendwie unterschiedliche Anforderungen für eine Reihe von zusätzlichen Argumenten basierend auf dem Wert dieser Eingabe zu haben. Vielleicht werde ich zweimal analysieren?

Als ein Beispiel, ist dies ein ähnlicher Fall:

Es gibt ein Positions Argument, Tier

Optionen für ein Tier sind Katze, Eidechse, Fisch

Für Katze, Argumente Krallen, Schnurrhaare, Pfoten

Für Eidechse, Argumente scale_color, favorite_food erforderlich

Für Fisch, Argument water_type i erforderlich sind s erforderlich

Wir wollen die erforderlichen zusätzlichen Argumente für jeden einzelnen Tierwert in -h dokumentieren, ohne auf unorthodoxe Praxis zurückzugreifen.

Ich überlegte, dies mit einem optionalen Argument für jede der Hauptkategorien zu tun. Das ist unattraktiv, weil das Dienstprogramm wirklich nur eines dieser Argumente nehmen will, und wenn ich es vermeiden kann, das Rad neu zu erfinden und dies zu dokumentieren, würde ich es vorziehen.

Ich könnte so etwas wie tun:

valid_commands = ['a','b','c','d','e','f','g'] 
parser.add_argument('command', choices = valid_commands) 
parser.add_argument('inputs', nargs = '*') 

Aber dann habe ich mich nicht gut Eingabeprüfungen auf die zusätzlichen Argumente für jeden Befehl Wahl.

Gibt es einen normalen Weg dies zu tun? Sicherlich ist es ziemlich üblich, ein Dienstprogramm zu schreiben, das mehrere mögliche Befehle und verschiedene erforderliche Argumente für jeden hat. Ich könnte auf jeden Fall die meisten Wünsche bekommen, die ich brauche, indem ich manuelle Überprüfungen und Hilfedokumentationen hinzufüge, aber das ist die Art von Dingen, die ich wahrscheinlich oft genug machen werde, dass es sich lohnt, es beim ersten Versuch richtig zu machen.

Vielen Dank für das Lesen und lassen Sie mich wissen, wenn ich helfen kann, Informationen zu geben.

Antwort

Verwandte Themen