Какая функциональность functools.partial предлагают, чтобы вы не могли пройти через лямбды?
Не так много в плане дополнительной функциональности (но, смотрите далее) - и, читаемость в глазах смотрящего.
Большинство людей, знакомых с функциональными языками программирования (в частности, в семьях Lisp/Scheme), похоже, как lambda
просто отлично - я говорю «большинство», определенно не все, потому что мы с Guido, безусловно, среди тех «знакомы с» (и т. д.), но думают о lambda
как аномалия в области зрения на Python ...
Он был раскаивающимся в том, что он принял его на Python, тогда как планировал удалить его из Python 3, как один из «сбоев Python».
Я полностью поддержал его в этом. (Я люблю lambda
в схеме ... в то время как его ограничение в Python и странным образом просто не вписывается в с остальной частью языка, делает мою кожу ползать).
Не так, однако, для полчищ lambda
любителей - которые организовали один из самых близких вещей к восстанию когда-либо видели в истории Пайтона, пока Guido не отошла и решил оставить 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
«s возвращается функция украшен атрибутами полезных для самоанализа - функция это упаковка, а также то, что позиционные и именованные аргументы он фиксирует в нем. Кроме того, названные аргументы могут быть перекрыты обратно («закреплением» является, скорее, в некотором смысле, установка по умолчанию):
>>> f('23', base=10)
23
Итак, как вы видите, это definely не так просто, как это lambda s: int(s, base=2)
! -)
Да, вы могли искажать свою лямбду, чтобы дать вам некоторые из этого - например, по ключевому слову-переопределение,
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
но я дорого надежда что даже самый горячий lambda
-lover не считает этим ужасом более читаемым, чем 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».частичный' вызов, тогда как лямбды самоочевидны. –