क्या कार्यक्षमता functools.partial
प्रदान करता है कि आप lambdas के माध्यम से प्राप्त नहीं कर सकते हैं?
अतिरिक्त कार्यक्षमता के मामले में बहुत अधिक नहीं है (लेकिन, बाद में देखें) - और, पठनीयता देखने वाले की नजर में है।
अधिकांश लोग जो कार्यात्मक प्रोग्रामिंग भाषाओं से परिचित हैं (जो विशेष रूप से लिस्प / स्कीम के परिवार वाले हैं) lambda
ठीक-ठाक पसंद करते हैं - मैं कहता हूं "सबसे", निश्चित रूप से सभी नहीं , क्योंकि गुइडो और मैं आश्वस्त रूप से उन "परिचित" (आदि) में से हैं। ) अभी तक lambda
पायथन में एक आंखों की बीमारी के रूप में सोचें ...
वह इसे पाइथन में स्वीकार करने के लिए पश्चाताप कर रहा था, जबकि इसे पायथन 3 से निकालने की योजना बनाई गई थी, "पायथन ग्लिट्स" में से एक के रूप में।
मैंने उसमें उनका पूरा समर्थन किया। (मैं lambda
योजना में प्यार करता हूं ... जबकि अजगर में इसकी सीमाएं हैं , और अजीब तरह से यह सिर्फ doesn ' बाकी भाषा के साथ, मेरी त्वचा को क्रॉल करें)।
हालांकि ऐसा नहीं है, हालांकि, 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
कॉल की तुलना में अधिक पठनीय नहीं मानते हैं! -)। "विशेषता सेटिंग" भाग और भी कठिन है, क्योंकि "शरीर की एक एकल अभिव्यक्ति" पायथन की सीमा है lambda
(प्लस तथ्य यह है कि असाइनमेंट कभी भी पायथन अभिव्यक्ति का हिस्सा नहीं हो सकता है) ... आप एक अभिव्यक्ति के भीतर "फ़ेकिंग असाइनमेंट" समाप्त करते हैं स्ट्रेचिंग लिस्ट को अच्छी तरह से समझ कर उसकी डिज़ाइन सीमा से ...:
>>> f = [f for f in (lambda f: int(s, base=2),)
if setattr(f, 'keywords', {'base': 2}) is None][0]
अब नामित-तर्कों को एक साथ अभिव्यक्ति में तीन विशेषताओं की स्थापना के साथ-साथ, और मुझे बताएं कि यह कितना पठनीय है ...!
functools.partial
कि आपके द्वारा बताई गई अतिरिक्त कार्यक्षमता इसे लंबोदर से बेहतर बनाती है। शायद यह एक और पोस्ट का विषय है, लेकिन यह एक डिज़ाइन स्तर पर क्या है जो आपको इतना परेशान करता हैlambda
?