Какие функции functools.partial
вы не можете получить с помощью лямбда-выражений?
Немногое с точки зрения дополнительной функциональности (но, см. Ниже) - и читаемость в глазах смотрящего.
Большинству людей, знакомых с функциональными языками программирования (в частности, из семейств Lisp / Scheme), кажется, это нравится lambda
просто - я говорю «большинство», определенно не все, потому что мы с Гвидо, несомненно, относимся к тем, кто «знаком с» (т. ), но считают, lambda
что это неприятная аномалия в Python ...
Он раскаивался в том, что когда-либо принимал это в Python, тогда как планировал удалить его из Python 3, как один из «глюков Python».
Я полностью его в этом поддержал. (Мне нравится lambda
Scheme ... в то время как его ограничения в Python и странный способ, которым он просто не с остальным языком заставляю кожу ползать).
Однако не так для орды lambda
влюбленных, которые устроили один из самых близких к восстанию событий в истории Python, пока Гвидо не отступил и не решил уйти lambda
.
Несколько возможных дополнений к functools
(чтобы сделать функции, возвращающие константы, идентичность, и т.д.) не произошло (чтобы избежать явного дублирования дополнительных lambda
функций), хотя partial
, конечно, осталось (это не полное дублирование и не бельмо на глазу).
Помните, что lambda
тело ограничено выражением , поэтому у него есть ограничения. Например...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partial
Возвращаемая функция украшена атрибутами, полезными для самоанализа - функцией, которую она обертывает, и позиционными и именованными аргументами, которые она там исправляет. Кроме того, названные аргументы могут быть переопределены сразу же («исправление», скорее, в некотором смысле, установка значений по умолчанию):
>>> f('23', base=10)
23
Так что, как видите, это определенно не так упрощенно, как lambda s: int(s, base=2)
! -)
Да, вы можете изменить свою лямбду, чтобы дать вам кое-что из этого - например, для переопределения ключевых слов,
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
но очень надеюсь, что даже самый ярый lambda
любитель не сочтет этот ужас более читабельным, чем partial
призыв! -). Часть «установки атрибута» еще сложнее из-за ограничения Python «тело - одно выражение» lambda
(плюс тот факт, что присваивание никогда не может быть частью выражения Python) ... вы в конечном итоге «подделываете присваивания внутри выражения» расширяя понимание списка далеко за пределы его дизайна ...:
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
Теперь объединить названные-аргументы overridability, а также установку трех атрибутов, в одно выражение, и скажите мне, насколько читаемым , что будет ...!
functools.partial
которых вы упомянули, делают его лучше лямбда. Возможно, это тема другого поста, но что вас так сильно беспокоит на уровне дизайнаlambda
?