Python functools.partial: зафиксировать аргументы

Категория: Python · Язык: Python · Обновлено:

functools.partial создаёт новую функцию с заранее заполненными аргументами. Позиционные аргументы добавляются слева, ключевые становятся значениями по умолчанию, которые можно переопределить при вызове. Это удобно для callback'ов, map, сортировки и фабрик функций без лишней лямбды.

Зафиксировать степень

Python
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))    # 8

partial не выполняет функцию сразу, а запоминает аргументы. При вызове square(5) получается power(5, exponent=2). Позиционные аргументы, переданные в partial, идут первыми, поэтому partial(power, 2)(5) вызовет power(2, 5), а не power(5, 2).

Подготовить callback с текстом

Python
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.