Просто используйте ключевые аргументы. Используя ваше определение f
выше,
>>> g = partial(f, z=10)
>>> g(2, 4)
40
>>> h = partial(f, y=4, z=10)
>>> h(2)
40
Обратите внимание, что как только вы используете аргумент ключевого слова для данного параметра, вы должны использовать аргументы ключевого слова для всех оставшихся аргументов. Например, следующее будет недопустимым:
>>> j = partial(f, x=2, z=10)
>>> j(4)
TypeError: f() got multiple values for argument 'x'
Но продолжать использовать ключевые аргументы:
>>> j = partial(f, x=2, z=10)
>>> j(y=4)
40
Когда вы используете functools.partial
, вы сохраняете значения *args
и **kwargs
для последующей интерполяции. Когда вы позже вызываете «частично примененную» функцию, реализация functools.partial
эффективно добавляет ранее предоставленные *args
и **kwargs
в список аргументов в начале и в конце соответственно, как если бы вы вставили эти распаковки аргументов сами. То есть, вызов
h = partial(1, z=10)
f(4)
примерно эквивалентен записи
args = [1]
kwargs = {'z': 10}
f(*args, 4, **kwargs)
Таким образом, семантика того, как вы предоставляете аргументы для functools.partial
, такая же, как для хранения аргументы в переменных args
и kwargs
выше, так что последний вызов f
имеет смысл. Для получения дополнительной информации взгляните на псевдо-реализацию functools.partial
, приведенную в документации модуля functools