2012-03-02 11 views
5

Niedawno miałem okazję przyjrzeć się strukturze web2py i chociaż mam pewne wcześniejsze doświadczenia z Django, a bardziej z prostym językiem Pythona, nie mogłem zrozumieć systemu kwerend, który wykorzystuje web2py.Jak działają wyrażenia zapytań web2py?

Weźmy ten przykład z 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 autor mówi, że (db.mytable.myfield > 'A') nie ocenia się Prawda/Fałsz bezpośrednio i to faktycznie obliczane dla każdego wiersza w momencie wyboru. Rozumiem, że dzięki temu wyrażenia mogą być używane jako obiekty zapytania, a nawet łączone.

Próbowałem znaleźć odpowiedź na to online, ale nie mogłem, więc oto moje pytanie: W jaki sposób te wyrażenia zapytań nie są od razu oceniane jako prawda/fałsz? Dlaczego wartość myquery nie jest, powiedzmy, prawda? Którą z funkcji Pythona, której prawdopodobnie brakuje, pozwala to działać?

Odpowiedz

7

innych odpowiedzi ma, ale po prostu, aby zapewnić trochę więcej Web2py konkretnych szczegółach:

db.mytable.myfield > 'A' 

db.mytable.myfield jest instancją Web2py DAL Field klasy, która dziedziczy z klasy DAL Expression. Sama klasa Expression przeciążenia liczbę operatorów pyton, takich jak ==, <, >, itd. Te przeciążone operatorzy po nałożeniu Expression (a zatem Field) przedmioty powrotu wystąpienie klasy DAL Query zamiast standardowej Pythona obiektu logicznego . Oto source code dla operatora > (__gt__).

Zobacz here, aby uzyskać więcej informacji na temat operatora przeciążającego w języku Python.

2

Każdy operator zastosowany do niestandardowych (niewbudowanych) obiektów na podstawie oceny special methods. Jest powszechnie znany jako operator overloading. Więc w zasadzie pola definicja klasy wyglądała podobnie:

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

    def __gt__(self,value): 
     #building query object, based on value 
     return query