2014-07-15 18 views
18

Così sto cercando di capire partials:functools.partial vuole usare un argomento posizionale come argomento chiave

import functools 

def f(x,y) : 
    print x+y 

g0 = functools.partial(f, 3) 
g0(1) 

4 # Works as expected 

In:

g1 = functools.partial(f, y=3) 
g1(1) 

4 # Works as expected 

In:

g2 = functools.partial(f, x=3) 
g2(1) 

TypeError: f() got multiple values for keyword argument 'x' 

Il TypeError scompare se utilizzo lo y come argomento della parola chiave:

In:

g2(y=1) 

4 

ciò che provoca il TypeError?

risposta

26

Questo non ha nulla a che fare con functools.partial, davvero. Si sta chiamando essenzialmente la funzione in questo modo:

f(1, x=3) 

Python soddisfa prima gli argomenti posizionali, e il tuo primo argomento è x. Quindi vengono applicati gli argomenti della parola chiave e l'utente è nuovamente fornito x.

functools.partial() non ha alcun mezzo per rilevare che è già stato fornito il primo argomento posizionale come argomento parola chiave. Non aumenterà la tua chiamata sostituendo l'argomento posizionale con un argomento di parola y=.

Quando si mescolano argomenti posizionali e parola chiave, è necessario fare attenzione a non utilizzare lo stesso argomento due volte.

Problemi correlati