Question

J'ai plusieurs couches d'appels de fonction, en passant autour d'un dictionnaire commun des arguments de mots clés:

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

Je voudrais fournir des arguments par défaut dans certains des appels de fonctions suivantes, quelque chose comme ceci:

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

Le problème avec cette approche est que si arg est à l'intérieur qwargs, un TypeError est levons « a plusieurs valeurs pour l'argument mot-clé ».

Je ne veux pas qwargs fixes [ « arg »] à défaut, car alors fonc3 obtient cet argument sans mandat. Je pourrais faire un copy.copy des qwargs et ensemble « arg » dans la copie, mais qwargs pourraient avoir une forte structures de données dans et je ne veux pas les copier (copy.copy peut-être ne serait pas seulement copy.deepcopy ?).

Quelle est la chose pythonique à faire ici?

Était-ce utile?

La solution

Il suffit de construire et d'utiliser une autre dict dans le but d'appeler func2, laissant le seul original pour l'appel plus tard func3:

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

Ceci est si vous voulez un paramètre pour arg en qwargs pour remplacer le default. Dans le cas contraire (si vous voulez default passer outre tout réglage possible pour arg en qwargs):

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

depuis le mot-clé argument dict remplace la valeur dans l'argument de position, le cas échéant.

Autres conseils

Pour créer une nouvelle dict avec les mêmes touches et valeurs que vous pouvez utiliser

 newdict=dict(qwargs)

Si qwargs ne contient pas les clés vraiment beaucoup de c'est pas cher.

S'il est possible que vous pouvez réécrire les fonctions de prendre leurs args vraiment comme dict au lieu de plusieurs args.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top