Яку функціональність functools.partial
пропонує ви не можете отримати через лямбда?
Не багато з точки зору додаткової функціональності (але, дивіться далі) - і, читабельність - це в очах того, хто дивиться.
Більшість людей, які знайомі з функціональними мовами програмування (зокрема, в сім'ях Lisp / Scheme), схоже, lambda
просто чудово - я кажу "більшість", безумовно, не всі, тому що ми з Гвідо, безумовно, є одними з "знайомих" (тощо) ) все-таки вважають lambda
аномалією очей у Python ...
Він розкаявся за те, що коли-небудь прийняв його в Python, тоді як планував видалити його з Python 3, як одну з "глюків Python".
Я в цьому його повністю підтримав. (Мені подобається lambda
в Схемі ... в той час як її обмеження в Python , і дивний спосіб це просто не відбувається " з рештою мови змусити мою шкіру повзати).
Однак це не для орди lambda
закоханих - які влаштували одну з найбільш близьких речей до заколотів, коли-небудь бачених за всю історію Пітона, доки Гуйдо не відступив і вирішив залишити 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
?