2010-06-23 6 views
1

Donc, je sais que vous pouvez envelopper une fonction autour d'une autre fonction en procédant comme suit.Passage Python dans les affectations de variables via un wrapper de fonction

def foo(a=4,b=3): 
    return a+b 
def bar(func,args): 
    return func(*args) 

donc si je puis appelé

bar(foo,[2,3]) 

la valeur de retour serait 5.

Je me demande est-il un moyen d'utiliser la barre pour appeler foo avec foo (b = 12) où la barre reviendrait 16?

Est-ce que cela a du sens? Merci beaucoup pour votre temps à l'avance! Et désolé de poser autant de questions.

Répondre

10

Cela nécessite la syntaxe **kwargs (keyword arguments).

def foo(a=4, b=3): 
    return a+b 
def bar(func, *args, **kwargs): 
    return func(*args, **kwargs) 

print bar(foo, b=12) # prints 16 

*args est un certain nombre d'arguments de position, **kwargs est tous les arguments qui ont été nommés passés dans

Et bien sûr, ils ne sont *args et **kwargs par convention. vous pouvez les nommer *panda et **grilled_cheese pour tous les soins Python.

+0

Merci Mark! C'est parfait, exactement ce dont j'avais besoin! –

4

Eh oui, vous pouvez également passer un dict en plus (ou au lieu de) la liste:

def bar(func, args=[], kwargs={}): 
    return func(*args, **kwargs) 

bar(foo, {'b':12}) 
Questions connexes