2010-04-30 7 views
0

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

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

je voudrais fournir des arguments par défaut dans certains des appels de fonctions ultérieures, quelque chose comme ça :

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 élevé avec « obtenu plusieurs valeurs pour argument mot-clé ».

Je ne veux pas définir qwargs ["arg"] par défaut, car alors func3 obtient cet argument sans garantie. Je pourrais faire un copy.copy des qwargs et mettre "arg" dans la copie, mais qwargs pourrait avoir de grandes structures de données dedans et je ne veux pas les copier (peut-être que copy.copy ne le ferait pas, seulement copy.deepcopy ?).

Quelle est la chose pythonique à faire ici?

+1

'qwargs' ressemble à des données et' func * 'ressemble à des méthodes. Avez-vous pensé à envelopper les deux dans une classe? Si vous faites cela, alors la signature de 'func2' pourrait être simplifiée à quelque chose comme' func2 (self, arg = default) '... – unutbu

Répondre

2

Il suffit de construire et utiliser un 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) 

est si vous voulez un paramètre pour arg en qwargs pour remplacer le default . Dans le cas contraire (si vous voulez default à écraser les paramètres possibles 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.

1

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.

Si c'est possible, vous pouvez réécrire les fonctions pour prendre leurs args vraiment comme dict au lieu de plusieurs args.

Questions connexes