2017-06-30 3 views
0

J'essaie d'utiliser la fonction partial du module functools sur un callable qui a un argument qui est une fonction. J'ai trouvé un exemple de code minimaliste.Comment utiliser le functools.partial sur une fonction qui a un argument qui est appelable?

from functools import partial 

def g(f, x): 
    return f(x) 

def cube(x): 
    return x*x*x 


p1 = partial(g, x=3) 
abc = p1(cube) # works 


p2 = partial(g, f=cube) 
abc = p2(3) # fails TypeError: g() got multiple values for keyword argument 'f' 

La fonction peut-elle fonctionner avec ce cas?

Merci

+1

Dans cette déclaration 'abc = p2 (3)' vous Réaffectation 3 à f ** ** qui est déjà attribué dans la déclaration précédente 'partial (g, f = cube)'. –

Répondre

0

Vous pouvez vous référer à la méthode partielle de la python doc

En nous ne pouvons pas passer deux fonctions partielles, donc cela peut être la question. Essayez de passer un objet fonction et le second argument est l'argument fonctionnel.

Vous pouvez utiliser,

p2 = partial(g, f=cube, x=1) 
abc = p2(x=3) 
print(abc) 

Espérons que cela vous aidera.

1

On lie pas au type de l'argument, l'appel de fonction (partielle) suit les règles https://docs.python.org/2/reference/expressions.html#calls Les arguments de position sont placés dans les premières fentes de paramètre, puis, si * expression est présente, l'expression est décompressé et placé dans les slots suivants, enfin si l'expression ** est présente, l'expression est mappée aux paramètres de la fonction et renvoie une erreur si le paramètre est déjà lié à un argument.

Alors

p2 = partial(g, f=cube) 
p2(3) # fails 

est la même que l'appel

g(3, f=cube)