functools.partialLambdas'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) lambdagayet iyi görünüyor - "en" diyorum, kesinlikle hepsi değil , çünkü Guido ve ben kesinlikle "aşina" olanlar arasındayız (vb. ) yine lambdade 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ı lambdaseverler - 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 lambdaişlevselliğinin açıkça çoğaltılmasını önlemek için ), partialtabii ki kaldı (bu tamamen kopya değil, ne de göze batan bir şey değil).
lambdaVü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.partialbahsettiğ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 şeylambdanedir?