Frage

Ich habe mehrere Schichten von Funktionsaufrufen, vorbei, um ein gemeinsames Wörterbuch des Schlüsselwort Argumente:

def func1(**qwargs):
    func2(**qwargs)
    func3(**qwargs)

Ich möchte einige Standardargumente in einigen der nachfolgenden Funktionsaufrufe liefern, so etwas wie folgt aus:

def func1(**qwargs):
    func2(arg = qwargs.get("arg", default), **qwargs)
    func3(**qwargs)

Das Problem bei diesem Ansatz ist, dass, wenn arg innerhalb qwargs ist, ein Typeerror mit „bekam mehrere Werte für die Keyword-Argument“ angehoben wird.

Ich will nicht zu Satz qwargs [ „arg“] auf dem Standard, denn dann func3 dieses Argument wird ohne Haftbefehl. Ich könnte eine copy.copy der qwargs und Satz „arg“ in der Kopie machen, aber qwargs große Datenstrukturen darin haben könnte und ich will nicht, um sie kopieren (vielleicht copy.copy würde nicht nur copy.deepcopy ?).

Was ist das pythonic, was hier zu tun?

War es hilfreich?

Lösung

Just zu bauen und verwenden Sie einen anderen dict zum Zwecke func2 des Aufrufs, die ursprüngliche allein für den späteren Aufruf func3 verlassen:

def func1(**qwargs):
    d = dict(arg=default)
    d.update(qwqargs)
    func2(**d)
    func3(**qwargs)

Dies ist, wenn Sie eine Einstellung für arg in qwargs wollen die default außer Kraft zu setzen. Ansonsten (wenn Sie default wollen für arg in qwargs jede mögliche Einstellung außer Kraft zu setzen):

def func1(**qwargs):
    d = dict(qwargs, arg=default)
    func2(**d)
    func3(**qwargs)

, da das Schlüsselwort-Argument dict überschreibt den Wert im Positions Argumente, falls vorhanden.

Andere Tipps

Um einen neuen dict mit den gleichen Schlüssel und Werte erstellen Sie verwenden können,

 newdict=dict(qwargs)

Wenn qwargs nicht wirklich viele Schlüssel enthalten, die billig ist.

Wenn es möglich ist, könnten Sie die Funktionen neu schreiben ihre args wirklich als dict statt mehrerer Argumente zu nehmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top