Fungsi apa yang functools.partialditawarkan yang tidak bisa Anda dapatkan melalui lambdas?
Tidak banyak dalam hal fungsi tambahan (tapi, lihat nanti) - dan, keterbacaan ada di mata yang melihatnya.
Kebanyakan orang yang terbiasa dengan bahasa pemrograman fungsional (khususnya yang berada dalam keluarga Lisp / Skema) tampaknya sangat menyukai lambda- saya katakan "sebagian besar", jelas tidak semua, karena Guido dan saya pasti termasuk di antara mereka yang "akrab dengan" (dll. ) namun dianggap lambdasebagai anomali yang merusak pemandangan di Python ...
Dia menyesal telah menerimanya ke Python sementara berencana untuk menghapusnya dari Python 3, sebagai salah satu "gangguan Python".
Saya sepenuhnya mendukungnya dalam hal itu. (Saya suka lambda Skema ... sementara keterbatasannya dalam Python , dan cara anehnya hanya tidak dengan sisa bahasa, buat kulit saya merangkak).
Namun tidak demikian bagi gerombolan lambdakekasih - yang melakukan salah satu hal paling dekat dengan pemberontakan yang pernah terjadi dalam sejarah Python, sampai Guido mundur dan memutuskan untuk pergi lambda.
Beberapa kemungkinan penambahan functools(untuk membuat fungsi mengembalikan konstanta, identitas, dll) tidak terjadi (untuk menghindari duplikasi lambdafungsi yang lebih eksplisit ), meskipun partialtentu saja tetap (tidak ada duplikasi total , juga tidak merusak pemandangan).
Ingat lambdatubuh itu terbatas pada ekspresi , jadi punya keterbatasan. Sebagai contoh...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partialFungsi yang dikembalikan dihiasi dengan atribut yang berguna untuk introspeksi - fungsi yang dibungkus, dan argumen posisional dan bernama apa yang diperbaiki di dalamnya. Lebih jauh, argumen yang dinamai dapat ditimpa segera kembali ("memperbaiki" agaknya, dalam arti, pengaturan default):
>>> f('23', base=10)
23
Jadi, seperti yang Anda lihat, itu pasti tidak sesederhanalambda s: int(s, base=2) ! -)
Ya, Anda dapat memutarbalikkan lambda Anda untuk memberi Anda ini - misalnya, untuk kata kunci-override,
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
tapi saya sangat berharap bahwa bahkan yang paling bersemangat lambda-lover tidak menganggap kengerian ini lebih mudah dibaca daripada partialpanggilan! -). Bagian "pengaturan atribut" bahkan lebih sulit, karena batasan "tubuh adalah ekspresi tunggal" dari Python lambda(ditambah fakta bahwa penugasan tidak pernah dapat menjadi bagian dari ekspresi Python) ... Anda akhirnya "memalsukan penugasan dalam ekspresi" dengan memperluas daftar pemahaman jauh melampaui batas desainnya ...:
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
Sekarang gabungkan override-argumen-nama yang dinamai, ditambah pengaturan tiga atribut, ke dalam satu ekspresi, dan katakan betapa mudahnya itu dibaca ...!
functools.partialyang Anda sebutkan membuatnya lebih unggul daripada lambda. Mungkin ini adalah topik dari posting lain, tetapi apa itu pada tingkat desain yang sangat mengganggu Andalambda?