2012-09-06 20 views
5

जबकि OpenERP विकासशील जा रहा है, मैं कोड का निम्न भागउपयोग

'app_date': lambda *a: time.strftime('%Y-%m-%d')

मैं जानता हूँ कि पाया क्या लैम्ब्डा is.My सवाल क्यों उपयोग लैम्ब्डा क्यों बस नहीं

है

'app_date': time.strftime('%Y-%m-%d')

उत्तर

13

'app_date': time.strftime('%Y-%m-%d') तुरंत time.strftime का मूल्यांकन करेगा। इसे लैम्ब्डा में लपेटकर, इसके निष्पादन को बाद में स्थगित कर दिया जाता है (वह समय जब आप लैम्ब्डा को कॉल करते हैं)। काफी बोलते हुए, अंतर "उस समय को परिभाषित करते समय" और "वह समय जब मैं इसका उपयोग कर रहा हूं" के बीच है। देखो:

>>> d = {'a': time.time(), 'b': lambda: time.time()} 
>>> d['a'], d['b']() 
(1346913545.049, 1346913552.409) 
>>> d['a'], d['b']() 
(1346913545.049, 1346913554.518) 
>>> d['a'], d['b']() 
(1346913545.049, 1346913566.08) 

मैं कुछ समय के प्रत्येक d['a'], d['b']() के बीच में बीत की अनुमति दी। ध्यान दें कि d['a'] हमेशा समान होता है: यह वह समय है जब मैंने d परिभाषित किया था। d['b'] एक समारोह है। d['b']() (कोष्ठक के साथ) फ़ंक्शन को कॉल करता है, जो प्रत्येक कॉल पर नए समय का मूल्यांकन करता है, इसलिए यह प्रत्येक उपयोग पर अलग होता है।

इसके अलावा, यह lambda के बारे में कुछ खास नहीं है। Lambdas बस किसी अन्य की तरह काम कर रहे हैं। मैं इसके साथ ऐसा कर सकता था:

def func(): 
    return time.time() 
d = {'a': time.time(), 'b': func} 
+2

दरअसल, और यह ओपनईआर मॉडल के लिए डिफ़ॉल्ट मानों में एक आम गड़बड़ी है। अधिकांश ओपनईआरपी डिफ़ॉल्ट मान सरल शाब्दिक तार/पूर्णांक/बूलियन हो सकते हैं, लेकिन डेटाटाइम को कॉल करने योग्य में लपेटने की आवश्यकता होती है, अन्यथा डिफ़ॉल्ट वैले हमेशा सर्वर स्टार्टअप दिनांक और समय होगा, और वर्तमान समय नहीं .. – odony

+0

http देखें: //en.wikipedia.org/wiki/Thunk_(functional_programming)। मैंने प्रदर्शन-प्रेरित आलसी मूल्यांकन के संदर्भ में केवल "थंक" शब्द सुना है, लेकिन यह इस समय से संबंधित उदाहरण पर भी लागू हो सकता है। किसी को पता है? – stalepretzel