Python functools.partial: зафиксировать аргументы
functools.partial создаёт новую функцию с заранее заполненными аргументами. Позиционные аргументы добавляются слева, ключевые становятся значениями по умолчанию, которые можно переопределить при вызове. Это удобно для callback'ов, map, сортировки и фабрик функций без лишней лямбды.
Зафиксировать степень
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
cube = partial(power, exponent=3)
print(square(5)) # 25
print(cube(2)) # 8partial не выполняет функцию сразу, а запоминает аргументы. При вызове square(5) получается power(5, exponent=2). Позиционные аргументы, переданные в partial, идут первыми, поэтому partial(power, 2)(5) вызовет power(2, 5), а не power(5, 2).
Подготовить callback с текстом
from functools import partial
def greet(greeting, name):
return f"{greeting}, {name}!"
hello = partial(greet, "Привет")
print(hello("Анна")) # Привет, Анна!
print(hello(name="Игорь")) # Привет, Игорь!Ключевое слово при вызове переопределяет сохранённое значение: partial(greet, "Привет", name="Мир") можно вызвать с другим name. Это отличается от жёсткой лямбды, где параметр нужно явно проклеить. В цикле partial также фиксирует текущее значение, тогда как лямбда с замыканием может увидеть последнее.
У partial нет атрибута __name__, поэтому в логах и traceback функция выглядит менее информативно. Используйте functools.update_wrapper или partial.func, если это важно. Для методов класса есть partialmethod, который работает как дескриптор. partial не проверяет сигнатуру при создании: ошибка несовпадения аргументов проявится только при вызове.
Не заменяйте partial там, где нужна полноценная функция с аннотациями и документацией: читаемость важнее краткости. Для асинхронных функций partial работает, но не создаёт корутину сам — её нужно вызвать и дождаться.
Документация: functools.partial, partialmethod.