Для чего используется каррирование (карринг) в реальных задачах?

Всем привет!

Недавно узнал о такой штуке как каррирование, на Python каррирование в простейшем случае можно записать так:

f = lambda y: lambda x: x + y
print f(2)(2)

Выведет: 4

Не могли бы вы привести пример (желательно из жизни и на Python), где можно применить каррирование, а то ума не приложу в каких реальных ситуациях оно может понадобиться.

Заранее спасибо за ответ!
  • Вопрос задан
  • 4404 просмотра
Решения вопроса 1
suguby
@suguby
программист, python, django, mysql, git, hg, linux
Предположим есть функция, которая берет много параметров, а первый параметр - имя класса формы (в джанго)
def cool_staff(form_class, inits, defaults, user, other_param):
    # много строчек кода

и вы вдруг обнаруживаете что в вашем коде куча вызовов, у которых первый параметр одинаков.
...
res = cool_staff(form_class=MainForm, inits={a:1, b:3}, defaults=[1,2,3], ...)
...
res = cool_staff(form_class=MainForm, inits={a:100500, b:42}, defaults=[3,2,1], ...)
...

Тогда делаете так:
main_cool_staff = lambda **kwargs: cool_staff(form_class=MainForm, **kwargs)

и ваши вызовы упрощаются
...
res = main_cool_staff(inits={a:1, b:3}, defaults=[1,2,3], ...)
...
res = main_cool_staff(inits={a:100500, b:42}, defaults=[3,2,1], ...)
...

было в реальном проекте.
UPD. Такая форма карринга не сработает для неименованных параметров
main_cool_staff = lambda *args, **kwargs: cool_staff(form_class=MainForm, *args, **kwargs)

поэтому используйте всегда именованные параметры, это хороший стиль.

UPD2. Еще подсказали вариант
import functools
main_cool_staff = functools.partial(cool_staff, MainForm)

работает и с неименованными параметрами. Спасибо Андрей Дугин
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы