Ответ
Модуль 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, обработчики событий, адаптация легаси-кода под новые интерфейсы. В общем, когда нужно сделать из своей стервозной функции — послушную и простую дурочку с одним аргументом.