Les arguments de Python
-
02-10-2019 - |
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?
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.