que propias procedimientos por parametros opcionales omision linea funciones comando argumentos python partial-application

python - propias - functools.partial quiere usar un argumento posicional como un argumento de palabra clave



python class kwargs (2)

Así que estoy tratando de entender partial :

import functools def f(x,y) : print x+y g0 = functools.partial( f, 3 ) g0(1) 4 # Works as expected

En:

g1 = functools.partial( f, y=3 ) g1(1) 4 # Works as expected

En:

g2 = functools.partial( f, x=3 ) g2(1) TypeError: f() got multiple values for keyword argument ''x''

El TypeError desaparece si uso y como un argumento de palabra clave:

En:

g2( y=1 ) 4

¿Qué causa el TypeError ?


Esto no tiene nada que ver con functools.partial , realmente. Esencialmente estás llamando a tu función así:

f(1, x=3)

Python primero cumple con los argumentos posicionales, y tu primer argumento es x . Luego se aplican los argumentos de la palabra clave, y nuevamente proporcionó x .

functools.partial() no tiene medios para detectar que ya proporcionó el primer argumento posicional como un argumento de palabra clave en su lugar. No aumentará su llamada al reemplazar el argumento posicional con un argumento de palabra clave y= .

Al mezclar argumentos posicionales y de palabras clave, debe tener cuidado de no usar el mismo argumento dos veces.


Para expandir la respuesta de @Martijn-Pieters, esta es la forma de preservar la naturaleza posicional del segundo parámetro. Aquí, el argumento de g2 se pasa de manera posicional como y:

def f(x,y) : print x+y g2 = functools.partial( f, *[3] ) g2(1)

Eso funciona cuando intentamos reemplazar un conjunto inicial de los argumentos de f. No sé cómo usar partial para reemplazar, por ejemplo, solo el segundo argumento de una función de 3 parámetros, y permitir que el primero y el tercero se pasen de manera posicional. Pero podrías hacer eso con una expresión lambda.