


Когда одну функцию нужно вызывать много раз с одинаковой настройкой, functools.partial создаёт удобный вызываемый объект с уже заданными аргументами. Исходная функция при подготовке ещё не выполняется. На Mentoring.digital разберём это на форматировании подписи суммы.
В учебном примере функция принимает число и название валюты. Нам нужен вариант, который по умолчанию добавляет RUB. Для денежных расчётов здесь не вводится новая модель округления: пример показывает только передачу аргументов.
from functools import partial
def format_amount(value, *, currency):
return f"{value:.2f} {currency}"
format_rubles = partial(format_amount, currency="RUB")
print(format_rubles(12.5)) # 12.50 RUB
print(format_rubles(8)) # 8.00 RUB
При создании format_rubles мы передали саму функцию без скобок вызова. Если написать format_amount(...), Python сначала вычислит результат этого вызова. Это уже другая операция, и строковый результат не заменит исходную функцию для partial.
Именованный параметр делает подготовленный вариант понятным: видно, какая именно настройка зафиксирована. Остальной код по-прежнему передаёт значение, которое меняется от вызова к вызову.
Дополнительные позиционные аргументы добавляются после ранее заданных позиционных аргументов. Именованные параметры дополняют сохранённые значения и могут их переопределить.
print(format_rubles(12.5, currency="USD"))
# 12.50 USD
def subtract(a, b):
return a - b
from_ten = partial(subtract, 10)
print(from_ten(3)) # 7
Последний пример специально использует несимметричную операцию: 10 оказывается первым аргументом. Название from_ten помогает не спутать это с вычитанием десяти из переданного числа. Когда порядок неочевиден, небольшая обычная функция с понятной сигнатурой может читаться лучше.
Partial не создаёт глубокую копию переданных объектов. Если заранее передать изменяемую коллекцию, важно понимать, кто ещё может её менять. Подготовленный вызов не является изолированным снимком состояния всей программы.
Также это не механизм кеширования: новый вызов снова обращается к исходной функции. Не рассчитывайте, что одинаковые аргументы автоматически дадут сохранённый результат предыдущего вычисления.
Для самостоятельной практики подготовьте функцию вывода строки с параметрами prefix и suffix. Создайте вариант с постоянным prefix, проверьте вызов с другим suffix и отдельный вызов с переопределением prefix. Объясните результат до запуска.
Разбор функций высшего порядка можно включить в обучение Python с практическими заданиями. Если сложно выбрать между partial, lambda и именованной функцией, обсудите читаемость решения с ментором по Python.