Functools.partial хочет использовать позиционный аргумент как аргумент ключевого слова

Итак, я пытаюсь понять partials:

import functools

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

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

4 # Works as expected

В:

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

4 # Works as expected

В:

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

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

TypeError исчезает, если я использую y как аргумент ключевого слова:

В:

g2( y=1 )

4

Что вызывает TypeError?

Ответы

Ответ 1

Это не имеет никакого отношения к functools.partial. Вы по сути вызываете свою функцию следующим образом:

f(1, x=3)

Сначала Python выполняет позиционные аргументы, а ваш первый аргумент x. Затем применяются аргументы ключевого слова, и вы снова поставляются x.

functools.partial() не имеет возможности обнаружить, что вы уже поставили первый позиционный аргумент в качестве аргумента ключевого слова. Он не увеличит ваш вызов, заменив аргумент positional аргументом y=.

При смешивании позиционных аргументов и ключевых слов вы должны стараться не использовать один и тот же аргумент дважды.