Как использовать `functools.partial` в Python для частичного применения функций?

Ответ

Модуль functools.partial в Python используется для частичного применения функций. Это означает создание новой функции, в которой некоторые аргументы исходной функции уже зафиксированы.

Почему это полезно? partial позволяет упростить вызовы функций с часто повторяющимися аргументами, создавать специализированные версии функций и повышать читаемость кода. Это особенно удобно при работе с колбэками, обработчиками событий или в функциональном программировании, где требуется передать функцию с заранее определенными параметрами.

Пример использования:

from functools import partial

def multiply(x, y):
    """Умножает два числа."""
    return x * y

# Создаем новую функцию 'double', где x всегда равно 2
double = partial(multiply, 2)

print(double(5))  # Выведет 10 (2 * 5)
print(double(10)) # Выведет 20 (2 * 10)

# Можно фиксировать аргументы по имени
power_of_2 = partial(pow, exp=2)
print(power_of_2(3)) # Выведет 9 (3**2)

Ключевые особенности:

  • Фиксация аргументов: Аргументы фиксируются слева направо. Для фиксации аргументов по позиции, которые не являются первыми, или для фиксации аргументов по имени, используйте именованные аргументы.
  • Гибкость: partial может быть скомбинирован с *args и **kwargs для создания очень гибких функций.
  • Неизменность: Частичное применение не изменяет оригинальную функцию, а создает новую обертку.
  • Применение: Часто используется в качестве колбэков, при работе с API, где нужно зафиксировать часть параметров, или для адаптации функций к интерфейсам, ожидающим меньшее количество аргументов.

Ответ 18+ 🔞

А, слушай, про этот functools.partial! Ну, блядь, гениальная хуйня, если честно. Представь себе: есть у тебя функция, как эта баба с характером — требует к себе десять аргументов, и все по именам, и все по расписанию. А тебе, сука, лень каждый раз эту церемонию проводить, потому что половину этих параметров ты всегда передаёшь одни и те же.

Вот тут-то partial и выручает, как лучший друг-алкоголик, который всегда подвезёт. Он берёт твою заёбанную функцию и говорит: «Расслабься, я тут кое-что зафиксировал». И создаёт тебе новую, упрощённую версию, где часть аргументов уже вбита гвоздями.

Зачем это, блядь, нужно? Ну, например, чтобы не писать одно и то же по сто раз. Или когда тебе нужно ссучить куда-то функцию-обработчик, а от тебя требуют, чтобы у неё был только один параметр, а у твоей — три. partial приходит и делает из твоей трёхаргументной стервы — скромную однопараметровую девицу. Удобно, ёпта!

Смотри, как это выглядит в деле:

from functools import partial

def multiply(x, y):
    """Умножает два числа."""
    return x * y

# Делаем из multiply — double. Говорим: «Запомни, сука, первый аргумент — всегда двойка!»
double = partial(multiply, 2)

print(double(5))  # Выдаст 10 (2 * 5). Вообще не паримся!
print(double(10)) # Выдаст 20 (2 * 10). Красота, блядь!

# А можно и по имени пришпилить, если функция та ещё стерва с именованными параметрами
power_of_2 = partial(pow, exp=2) # Говорим функции pow: «exp у тебя всегда будет 2, не рыпайся»
print(power_of_2(3)) # Выдаст 9 (3**2). Всё, приехали.

На что смотреть, чтобы не обосраться:

  • Фиксация идёт слева направо. Хочешь зафиксировать не первый аргумент? Либо терпи, либо используй именованные аргументы, хитрая жопа.
  • Гибкость — овердохуища. Работает с *args и **kwargs, так что можно творить вообще любую хуйню.
  • Оригинал не трогает. Как тот аккуратный алкаш, который выпил, но бутылку на место поставил. Создаёт новую обёртку, старую не портит.
  • Где применять? Да везде, блядь! Колбэки в GUI, обработчики событий, адаптация легаси-кода под новые интерфейсы. В общем, когда нужно сделать из своей стервозной функции — послушную и простую дурочку с одним аргументом.