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: Standardwert oder angegebener Wert
  • Wie man über Argumente iteriert
  • Python mehrere Benutzer-Argumente zu einer Liste
  • Wie erstelle ich einen Python-Namespace (argparse.parse_args value)?
  • Akzeptieren eines Wörterbuchs als Argument mit argparse und python [duplizieren]
  • Djangos Call_Command scheitert mit fehlenden erforderlichen Argumenten
  • Python argparse Optionales Argument funktioniert nur, wenn es in die richtigen Positionen eingetragen ist
  • Wie man Positionsargumente mit dem führenden Minuszeichen (negative Zahlen) mit Argparse analysiert
  • 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.