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?

  • Importieren von Variablen aus einem Namespace-Objekt in Python
  • Ruby optparse Einschränkungen
  • Argparse: Weg, um Standardwerte in '--help' einzuschließen?
  • Gibt es einen Weg, um Argument in Python's argparse zu schaffen, die true zurückgibt, falls keine Werte gegeben sind
  • Erstellen von versteckten Argumenten mit Python-Argparse
  • Verschachtelter ArgumentParser
  • Argparse "ArgumentError: Argument -h / - Hilfe: Konflikt-Option String (s): -h, --help"
  • Kann ich ein Namespace-Objekt von veränderlichen zu unveränderlichen konvertieren?
  • 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.