2008-09-09 9 views
11

Dire que j'ai les méthodes suivantes:Passant sur des arguments variables nommés en python

def methodA(arg, **kwargs): 
    pass 

def methodB(arg, *args, **kwargs): 
    pass 

En methodA je souhaite appeler methodB, en passant sur les kwargs. Cependant, il semble que si je définis methodA comme suit, le second argument sera transmis en tant qu'arguments variables positionnels plutôt que nommés.

def methodA(arg, **kwargs): 
    methodB("argvalue", kwargs) 

Comment puis-je faire en sorte que les kwargs ** à methodA est transmis comme ** kwargs à methodB?

Répondre

33

Placez les astérisques avant la variable kwargs. Cela fait passer Python la variable (qui est supposée être un dictionnaire) en tant qu'arguments mot-clé.

methodB("argvalue", **kwargs) 
+0

Je ne sais pas combien de fois j'ai dû chercher cette chose - c'est si simple et pourtant. Merci de l'avoir mis en place même si c'est évident :) – cybertoast

1

Quelques essais et je me suis dit celui-ci sur:

def methodA (arg, ** kwargs): methodB ("argvalue", ** kwargs)

Cela semble évident maintenant ...

2

En aparté: Lorsque vous utilisez des fonctions au lieu de méthodes, vous pouvez également utiliser functools.partial:

import functools 

def foo(arg, **kwargs): 
    ... 

bar = functools.partial(foo, "argvalue") 

La dernière ligne définira une fonction « bar » qui, lorsqu'il est appelé, appellera foo avec le premier argument défini sur « argvalue » et toutes les autres fonctions vient de passer sur:

bar(5, myarg="value") 

appellera

foo("argvalue", 5, myarg="value") 

Malheureusement cela ne fonctionnera pas avec les méthodes.

+0

Qu'est-ce que cela fait réellement? Qu'est-ce que cela a à voir avec la question? – rjmunro

Questions connexes