2011-04-01 16 views
6

मुझे पता है कि किसी ऑब्जेक्ट को कॉल करने से बचने के लिए पर nocall का उपयोग करना अच्छा अभ्यास है। कुछ पृष्ठभूमि की सराहना करेंगे (लिंक) क्योंकि यह मेरे लिए थोड़ा अस्पष्ट लगता है :-)मेरी ताल पर नॉकल का उपयोग कब करें: हालत?

तो आप नॉकल का उपयोग कब करते हैं? क्या यह मेरी सभी स्थितियों पर इसे चोट पहुंचाने में चोट पहुंचा सकता है?

धन्यवाद!

उत्तर

12

मैं ताल का उपयोग करते हैं "चर अजगर"। इस तरह मैं हमेशा डिफ़ॉल्ट पथ अभिव्यक्ति से जादू व्यवहार से डरने के बिना सामान्य उचित पायथन अभिव्यक्ति लिख सकता हूं।

पथ अभिव्यक्ति कई चीजें करेगी, उदाहरण के लिए यदि यह कॉल करने योग्य है तो अभिव्यक्ति में चर को कॉल करें। अक्सर आप टीएएल में उपकरण या सामग्री आइटम से निपटते हैं, जो सभी कॉल करने योग्य हैं।

सबसे आम गलती एक ताल का उपयोग करना है: condition = "content_object"। सामग्री ऑब्जेक्ट कई एपीआई से आ सकता है, उदाहरण के लिए किसी भी प्रकार का संदर्भ फ़ील्ड कॉलिंग सामग्री ऑब्जेक्ट्स लौटाएगा। कैटलॉग खोज "मस्तिष्क" लौटाएगी लेकिन लिस्टिंग में आपको अक्सर इन विशेषताओं तक पहुंचने की आवश्यकता होती है, इसलिए आपके पास एक ताल है: परिभाषित करें = "obj brain/getObject"।

सामग्री ऑब्जेक्ट को कॉल करना ऑब्जेक्ट को प्रस्तुत करने का कारण बनता है जैसे ब्राउज़र ने अनुरोध किया होगा। चूंकि प्रतिपादन पृष्ठ आमतौर पर 500ms और 2 सेकंड के बीच लेते हैं, तो आप उस समय तक अपने पृष्ठ को धीमा कर देते हैं। यदि आप 25 आइटमों पर लूप में ऐसा करते हैं, तो मैं उम्मीद करता हूं कि पृष्ठ को प्रस्तुत करने के लिए 30 सेकंड या अधिक समय लगेगा।

5

nocall आपको ऑब्जेक्ट की विशेषता या विधि में "हैंडलर" प्राप्त करने देता है। आप अगर उद्देश्य यह है कि विशेषता या विधि का उपयोग करना चाहिए है जानना चाहते हैं:

<div tal:condition="nocall:context/method|nothing"> 
    ... 
</div> 

|nothing अजगर कोड में कोई except ब्लॉक के रूप में समान काम करता है: यदि context/method विफल रहता है (अपरिभाषित है), nothing लौट आते हैं। (यह वास्तव में असली स्पष्टीकरण नहीं हो सकता है लेकिन इस तरह काम करता है)।

nocall उपयोग करने के लिए एक अन्य कारण विधि है कि आप जानते हैं परिभाषित किया गया है के हैंडलर प्राप्त करने के लिए है और आप बाद में उपयोग करेंगे: के बजाय: दशा =:

<div tal:define="method nocall:context/method"> 
    <span tal:content="python:method(3)" /> 
    <span tal:content="python:method('hello')" /> 
    <span tal:content="python:method('whatever')" /> 
</div> 
1

मुझे लगता है कि आप केवल उन स्थानों पर nocall: जोड़ सकते हैं जो पहले से ही कॉल करने योग्य नहीं हैं, और संभवतः पाइथन निर्मित callable परीक्षण से बचने से आपको प्रदर्शन में वृद्धि मिल सकती है।

उस प्रश्न का संक्षिप्त उत्तर नहीं है, जो आपकी मदद नहीं करेगा। मेरे मैकबुक प्रो लैपटॉप पर, callable(True) चल रहे 119ns प्रति लूप पर 1000 गुना घड़ियों, सादे True कथन के लिए प्रति लूप बनाम 71ns घड़ियों। तो सरल पायथन वस्तुओं के लिए, callable परीक्षण केवल 48ns लेता है। दूसरी ओर एक TALES कथन में nocall: जोड़ना, अतिरिक्त प्रसंस्करण की आवश्यकता है जो लगभग callable परीक्षण के 48ns ओवरहेड से अधिक निश्चित रूप से आपके द्वारा सहेजे गए परीक्षण से अधिक हो जाएगा।

इस प्रकार, प्रदर्शन में सुधार के लिए nocall: जोड़ना पीछे हट जाएगा। आप उचित कैशिंग लागू करने से बेहतर होंगे (वर्निश के साथ संयोजन में plone.app.caching देखें), या Chameleon आपके उपयोग-मामले के लिए काम कर सकता है तो एक नज़र डालें।

0

इसे अपनी सभी स्थितियों पर न रखें। यह चोट पहुंचा सकता है! खासकर जो लोग आपके कोड का पालन करना चाहते हैं :-)

संबंधित मुद्दे