Verwenden von argparse-Argumenten als Keyword-Argumente

Angenommen, ich habe einen args Namespace nach dem Analysieren meiner Kommandozeile mit argparse. Nun möchte ich das verwenden, um solche Objekte wie folgt zu erstellen:

 foo = Foo(bar=args.bar) 

Leider habe ich die Einschränkung, dass wenn ein Keyword-Argument gesetzt ist, darf es kein None . Jetzt muss ich überprüfen, ob args.bar gesetzt ist und entsprechend handeln:

 if args.bar: foo = Foo(bar=args.bar) else: foo = Foo() 

Das ist unhandlich und skaliert nicht mehr Argumente. Was ich gerne hätte, ist so etwas wie folgt:

 foo = Foo(**args.__dict__) 

Aber das leidet immer noch an meinem ursprünglichen Problem und funktioniert zusätzlich nicht für Schlüssel, die keine Keyword-Argumente der __init__ Methode sind. Gibt es einen guten Weg, um diese Dinge zu erreichen?

  • Python argparse - Argument für mehrere Subparser hinzufügen
  • Python argparse: Wie kann ich Hilfe bei Fehler automatisch anzeigen?
  • Python Lesen von Stdin mit Argumenten
  • Argparse - unterscheide zwischen keine Optionen, Option aufgerufen und Option mit Argument aufgerufen?
  • Import argparse fehlschlägt, einige Setup / Pfad Problem?
  • Variable Schlüssel / Wert-Paare mit Argparse (Python)
  • Kann man in Python 2.7 ein Minimum an ZWEI Argumenten verlangen?
  • Python argparse AssertionError von metavar `[[USER @] HOST:] FILE`
  • 2 Solutions collect form web for “Verwenden von argparse-Argumenten als Keyword-Argumente”

    Du könntest so etwas ausprobieren:

     >>> defined_args = {k:v for k,v in args._get_kwargs() if v is not None} >>> foo = Foo(**defined_args) 

    Beispielsweise:

     >>> import argparse >>> args = argparse.Namespace(key1=None,key2='value') >>> {k:v for k,v in args._get_kwargs() if v is not None} {'key2': 'value'} 

    Beachten Sie jedoch, dass _get_kwargs() nicht Teil der öffentlichen API ist, also möglicherweise in zukünftigen Versionen / Versionen verfügbar sein kann.

    Ich denke, Sie können var () verwenden :

     args = parser.parse_args() Foo(**vars(args)) 

    Vars ([object]) gibt den Namespace als Wörterbuch zurück

    Python ist die beste Programmiersprache der Welt.