argparse-Unterbefehle, die mit verschachtelten namespaces

Tut argparse bieten integrierte Funktionen für Sie analysieren Gruppen-oder Parser in Ihre eigenen namespaces? Ich fühle mich wie ich muss fehlt eine option irgendwo.

Bearbeiten: Dieses Beispiel ist wohl nicht genau, was ich tun sollte, um die Struktur der parser, um mein Ziel, aber es war, was ich gearbeitet bisher. Mein Ziel ist es, in der Lage sein zu geben, subparsers Gruppen von Optionen, die analysiert werden, in namespace Felder. Die Idee hatte ich mit den Eltern war einfach zu bedienen Allgemeine Optionen für diesen gleichen Zweck.

Beispiel:

import argparse

# Main parser
main_parser = argparse.ArgumentParser()
main_parser.add_argument("-common")

# filter parser
filter_parser = argparse.ArgumentParser(add_help=False)
filter_parser.add_argument("-filter1")
filter_parser.add_argument("-filter2")

# sub commands
subparsers = main_parser.add_subparsers(help='sub-command help')

parser_a = subparsers.add_parser('command_a', help="command_a help", parents=[filter_parser])
parser_a.add_argument("-foo")
parser_a.add_argument("-bar")

parser_b = subparsers.add_parser('command_b', help="command_b help", parents=[filter_parser])
parser_b.add_argument("-biz")
parser_b.add_argument("-baz")

# parse
namespace = main_parser.parse_args()
print namespace

Dies ist, was ich bekomme, sind offensichtlich:

$ python test.py command_a -foo bar -filter1 val
Namespace(bar=None, common=None, filter1='val', filter2=None, foo='bar')

Aber das ist, was ich bin wirklich nach:

Namespace(bar=None, common=None, foo='bar', 
          filter=Namespace(filter1='val', filter2=None))

Und dann auch eher Gruppen von Optionen bereits untersucht und in namespaces:

Namespace(common=None, 
          foo='bar', bar=None,  
          filter=Namespace(filter1='val', filter2=None),
          anotherGroup=Namespace(bazers='val'),
          anotherGroup2=Namespace(fooers='val'),
          )

Habe ich gefunden, Verwandte Frage hier aber es beinhaltet einige benutzerdefinierte analysieren und scheint, deckt nur einen wirklich spezifischen Umstand.

Gibt es eine Möglichkeit irgendwo zu sagen, argparse zu analysieren, die bestimmten Gruppen in einem Namensraum Felder?

  • Ich bin mir nicht sicher, wie Sie erwarten, dass dies funktioniert. Wie haben Sie es geschrieben, filter1 und filter2 sind auf der top-level-parser, die nicht in einem Kind-parser namens filter. Wie könnte argparse wissen, dass Sie es wollen, zu handeln wie ein Kind von jedem sub-parser, wenn es gar nicht?
  • Vielleicht sollte ich neu formatieren mein Beispiel basiert auf Ihre Frage. Weil wirklich die Struktur, die ich zusammen setzen ist nicht sinnvoll, da du darauf hingewiesen hast. Mein Ziel ist wirklich in der Lage sein zu gelten Gruppen von Optionen, um subparsers, und haben Sie analysiert in einem namespace. Es wäre schön, wenn Sie könnten gemein sein, das ist, warum ich habe versucht mit der übergeordneten Struktur.
  • So sind Sie auf der Suche nach so etwas wie pip, git usw., wo gibt es, neben der top-level-globalen Optionen und Optionen, die spezifisch für jedes subkommando, auch Optionen, die gemeinsam von mehreren verschiedenen Unterbefehle (z.B. die --verbose, --upgrade, und --user Optionen pip, beziehungsweise), und in der Lage sein zu vertreten, dass die Freigabe direkt anstatt es implizit (durch kopieren die option Gruppen zu mehreren subparsers)?
  • Oder Sie wollen einfach nur genau das, was add_argument_group hat (und Sie zufrieden sind, kopieren Sie die Gruppe um), außer, Sie möchten die zusammengefassten Argumente erscheinen in einem sub-namespace in den Ergebnissen? Denn das wäre sehr einfach mit einem post-Prozessor: für jede Gruppe, erstellen Sie eine sub-namespace, die Iteration der Haupt-namespace, und jedes argument, das ein Mitglied der Gruppe, verschieben Sie es auf der sub-namespace. Aber die Arbeit mit sub-Parser wird ein wenig komplizierter, wenn Sie das so gut.
  • Yep, du hast Recht. Ich sollte mit einem argument-Gruppe, und das tun des post-processing nach der Tat. Danke für die Antwort!
  • Offtopic, sobald Sie versuchen docopt Sie werden nie gehen zurück zu argparse/optparse/was auch immer...

InformationsquelleAutor jdi | 2013-09-06
Schreibe einen Kommentar