functools.partial
Lambdas'dan geçemediğiniz işlevler nelerdir ?
Ekstra işlevsellik açısından çok fazla değil (ancak daha sonra bakınız) - ve okunabilirlik bakanın gözündedir.
Fonksiyonel programlama dillerine aşina olan çoğu insan (özellikle Lisp / Şema ailelerinde olanlar) lambda
gayet iyi görünüyor - "en" diyorum, kesinlikle hepsi değil , çünkü Guido ve ben kesinlikle "aşina" olanlar arasındayız (vb. ) yine lambda
de Python'da göze batan bir anomali olarak düşünün ... Python'a
kabul etmeyi tövbe ederken, Python 3'ten "Python'un aksaklıklarından" biri olarak çıkarmayı planladı.
Onu tam olarak destekledim. ( lambda
Scheme'de seviyorum ... Python'daki sınırlamaları ve sadece garip yolu dilin geri kalanıyla, cildimi tara.
O kadar ki, ordularını lambda
severler - Guido backtracked ve ayrılmaya karar verene kadar, hiç Python'un tarihinin görülen bir isyan en yakın şeylerden biri sahnelenen lambda
. İçinde
için çeşitli mümkün eklemeler functools
(fonksiyonlar sabitler, kimlik dönen yapmak, vs) olmadı (tabii ki daha fazla lambda
işlevselliğinin açıkça çoğaltılmasını önlemek için ), partial
tabii ki kaldı (bu tamamen kopya değil, ne de göze batan bir şey değil).
lambda
Vücudunun bir ifade olmakla sınırlı olduğunu unutmayın , bu yüzden sınırlamaları var. Örneğin...:
>>> import functools
>>> f = functools.partial(int, base=2)
>>> f.args
()
>>> f.func
<type 'int'>
>>> f.keywords
{'base': 2}
>>>
functools.partial
's döndürülen işlevi içgözlem için yararlı özniteliklerle süslenmiştir - kaydırma işlevi ve içinde hangi konumsal ve adlandırılmış bağımsız değişkenleri düzeltir. Ayrıca, adlandırılan argümanlar hemen geri alınabilir ("sabitleme" bir anlamda varsayılanların ayarıdır):
>>> f('23', base=10)
23
Gördüğünüz gibi Yani, bu kadar tanımlık kadar basit değil lambda s: int(s, base=2)
! -)
Evet, olabilir bu bazılarını vermek için lambda çarpıtmak - anahtar kelime-geçersiz kılma için, örneğin,
>>> f = lambda s, **k: int(s, **dict({'base': 2}, **k))
ama umarım en ateşli lambda
-lover bile bu dehşeti partial
çağrıdan daha okunabilir saymaz ! -). "Öznitelik ayarı" bölümü, Python'un "gövde tek bir ifadesi" sınırlaması lambda
(ayrıca, atamanın hiçbir zaman bir Python ifadesinin parçası olamayacağı gerçeği) nedeniyle daha da zorlaşır ... "bir ifade içindeki taklit ödevleri" liste kavrayışını tasarım sınırlarının çok ötesine taşıyarak ...:
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
Şimdi adlandırılmış argümanların geçersiz kılınabilirliğini ve üç özniteliğin ayarını tek bir ifadede birleştirin ve bana bunun ne kadar okunabilir olacağını söyleyin ...!
functools.partial
bahsettiğiniz ekstra işlevselliğin onu lambda'dan daha üstün kıldığını söyleyebilirim. Belki de bu başka bir gönderinin konusudur, ancak tasarım düzeyinde sizi bu kadar rahatsız eden şeylambda
nedir?