2010-02-19 11 views
8

में डिफर्ड मूल्यांकन मैंने पायथन में स्थगित मूल्यांकन (उदाहरण के लिए here) के बारे में सुना है, क्या यह सिर्फ यह बताता है कि कैसे उपयोग किए जाने पर दुभाषिया द्वारा लैम्बडा का मूल्यांकन किया जाता है? या यह वर्णन करने के लिए उचित शब्द है कि, पाइथन के गतिशील डिज़ाइन के कारण, इसे रनटाइम तक कई त्रुटियां नहीं मिलेंगी?पायथन

या क्या मैं पूरी तरह से कुछ याद कर रहा हूं?

उत्तर

8

Dietrich का जवाब एक अच्छा है, लेकिन मैं तो बस को जोड़ने के लिए है कि टाल मूल्यांकन का सबसे सरल रूप if बयान है हैं:,

if True: 
    x = 5 
else: 
    x = y # huh? what is y? 

इस कोड को पार्स करता है और सही ढंग से चलाता है, हालांकि else खंड कोई मतलब नहीं है - y अपरिभाषित है। else खंड केवल पार्स किया जा रहा है - इसलिए यह सिथैक्टिक रूप से वैध पायथन होना चाहिए। यह वास्तव में कुछ सरल कोड के लिए इस्तेमाल किया जा सकता है:

if stuff: 
    print stuff.contents 
else: 
    print "no stuff" 

एक जोरदार टाइप किया भाषा यह काम नहीं है, क्योंकि टाइप करने के लिए stuff.contents में stuff की आवश्यकता है एक contents विशेषता है कि एक खास प्रकार के होने के लिए। पायथन में, if में बयानों के स्थगित मूल्यांकन की वजह से, यह जरूरी नहीं है। stuffNone हो सकता है जो स्पष्ट रूप से कोई विशेषता नहीं है, और दुभाषिया केवल पहले को निष्पादित किए बिना else खंड लेगा। इसलिए यह वैध पायथन और यहां तक ​​कि एक मुहावरे है, जो कोड को सरल बनाता है।

Reference discussion

+7

मुझे लगता है कि आप अपने दूसरे उदाहरण में भ्रमित प्रकार सिस्टम और आलसी मूल्यांकन कर रहे हैं। "मजबूत" टाइप की गई भाषा साफ चाल करने के लिए आलसी मूल्यांकन का उपयोग कर सकती हैं। जैसे हास्केल के पास बहुत आलसी मूल्यांकन के साथ एक बहुत मजबूत स्थिर प्रकार प्रणाली है! पायथन के विपरीत, 'if-then-else' को टाइप-चेक करना होगा, लेकिन इसके अलावा मूल्यांकन स्थगित कर दिया गया है। उदाहरण के लिए, आप लिख सकते हैं 'यदि सही है तो 5 और अपरिभाषित', और यह संकलित करता है और ठीक चलता है (और परिणाम 5 अपेक्षित है)। कि आपका 'if-else' पायथन में काम करता है भले ही यह स्थिर भाषा में टाइप-चेक न करे, मूल्यांकन रणनीति से संबंधित नहीं है। –

14

निर्धारित मूल्यांकन तब होता है जब इसकी आवश्यकता होने तक अभिव्यक्ति का मूल्यांकन नहीं किया जाता है। अधिकांश भाषाओं में, आप इस काम को करने के लिए lambda जैसे कुछ का उपयोग करते हैं। यहाँ एक काल्पनिक उदाहरण है कि अवधारणा के हिस्से से पता चलता है:

def list_files(): 
    for fn in os.listdir('.'): 
     yield fn, lambda: open(fn, 'r').read() 


for fn, body in list_files(): 
    if fn.endswith('.txt'): 
     print body() 

यहाँ, list_files फ़ाइल नाम का एक समूह और एक "thunk" (कोई तर्क के साथ लैम्ब्डा) जो फ़ाइल की सामग्री रिटर्न देता है। "थंक" एक स्थगित मूल्यांकन है। Thunks का उपयोग करके आप अपनी चिंताओं को अलग करने के लिए अनुमति देता है:

  • The Loop पता है कि कैसे फ़ाइलों को पढ़ने की जरूरत नहीं है के लिए है, तो list_fileslist_ftp_files या list_zip_archive साथ प्रतिस्थापित किया जा सकता है।
  • list_files फ़ंक्शन को यह जानने की आवश्यकता नहीं है कि कौन सी फाइलें पढ़ी जाएंगी। Thunks के साथ, यह हर एक फ़ाइल को पढ़ने की जरूरत नहीं है।

उचित स्थगित मूल्यांकन में, एक बार जब आप "थंक" का मूल्यांकन करते हैं तो यह एक मूल्यांकन प्रति के साथ खुद को बदल देगा, इसलिए इसे दो बार मूल्यांकन करना अब एक बार मूल्यांकन करने से अधिक काम नहीं करेगा। वही चीज़ों को पूरा करने के अन्य तरीके हैं, जैसे कक्षाओं और वस्तुओं के साथ जो मूल्यों को कैश करते हैं।

निर्धारित मूल्यांकन योजना में एक (अपेक्षाकृत) सामान्य मुहावरे है। हास्केल में, मूल्यांकन डिफ़ॉल्ट रूप से स्थगित कर दिए जाते हैं और आपको ऐसा करने के लिए किसी भी वाक्यविन्यास की आवश्यकता नहीं होती है (इसे बंद करने के लिए विशेष वाक्यविन्यास है)।

+4

लैम्ब्डा टाल रहा है, लेकिन भंडारण के बारे में सावधान रहना होगा, के रूप में वे के रूप में आप वर्तमान में उन्हें fn पर कब्जा नहीं: http://codepad.org/fXfIj364। और एक और चेतावनी: http://codepad.org/poXS7nc2। –

+0

यह एक अच्छा बिंदु है, और पाइथन में कोडिंग करते समय मैं लैम्ब्डा से दूर रहने के कारणों में से एक हूं। –

+1

यही कारण है कि मैं तर्कों को स्थिर करने के लिए इनलाइन फ़ंक्शंस + 'functools.partial' पसंद करता हूं: http: // codepad।संगठन/fwxLbl7l – schlamar