2012-03-02 22 views
5

मुझे हाल ही में वेब 2py ढांचे पर एक नज़र डालने का मौका मिला है और हालांकि मुझे डीजेगो के साथ कुछ पूर्व अनुभव है और सादा पायथन के साथ और अधिक, मैं क्वेरी सिस्टम से समझ नहीं पा रहा हूं जो web2py नियोजित करता है।web2py क्वेरी अभिव्यक्ति कैसे काम करती है?

के web2py book

db = DAL('sqlite://storage.db') 
myquery = (db.mytable.myfield > 'A') 
myset = db(myquery) 
rows = myset.select() 
for row in rows: 
    print row.myfield 

In a SO comment web2py लेखक की ओर से इस उदाहरण लेते हैं का कहना है कि (db.mytable.myfield > 'A') सीधे करने के लिए सही/गलत का मूल्यांकन नहीं करता है और यह वास्तव में चयन के समय में प्रत्येक पंक्ति के लिए मूल्यांकन किया है। मैं समझता हूं कि यह अभिव्यक्ति इन वस्तुओं को क्वेरी ऑब्जेक्ट्स के रूप में उपयोग करने की अनुमति देता है और यहां तक ​​कि संयुक्त भी हो सकता है।

मैंने इस ऑनलाइन का जवाब खोजने का प्रयास किया है, लेकिन यह नहीं हो सकता है, तो यहां मेरा प्रश्न है: वे प्रश्न अभिव्यक्ति सही/गलत पर मूल्यांकन क्यों नहीं कर रहे हैं? Myquery का मूल्य क्यों नहीं है, सच है? क्या पाइथन सुविधा है कि मैं शायद याद कर रहा हूँ यह काम करने की अनुमति देता है?

उत्तर

7

अन्य उत्तर यह है, लेकिन सिर्फ एक छोटे से अधिक web2py विशेष विस्तार प्रदान करने के लिए:

db.mytable.myfield > 'A' 

db.mytable.myfield web2py दाल Field वर्ग है, जो दाल Expression वर्ग से विरासत का एक उदाहरण है। Expression वर्ग ही आदि अजगर ऑपरेटरों के एक नंबर, जैसे ==, <, >, ये अतिभारित ऑपरेटर, जब Expression (और इसलिए Field) के लिए आवेदन किया बल्कि एक मानक अजगर बूलियन वस्तु से दाल Query वर्ग का एक उदाहरण लौट वस्तुओं overloads । > (__gt__) ऑपरेटर के लिए source code यहां है।

ऑपरेटर पर पाइथन में ओवरलोडिंग के लिए here देखें।

2

कोई भी ऑपरेटर special methods के मूल्यांकन के आधार पर कस्टम (गैर-निर्मित) वस्तुओं पर लागू होता है। इसे operator overloading के रूप में व्यापक रूप से जाना जाता है। तो मूल रूप से क्षेत्र वर्ग परिभाषा को समान रूप से देखा:

class DBField(...): 
#... 

    def __gt__(self,value): 
     #building query object, based on value 
     return query 
संबंधित मुद्दे