2012-03-02 19 views
5

Recientemente tuve la oportunidad de echar un vistazo al framework web2py y aunque tengo alguna experiencia previa con Django y más con Python sin formato, no pude entender el sistema Query que usa web2py.¿Cómo funcionan las expresiones de consulta web2py?

Tomemos este ejemplo de 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 autor web2py dice que (db.mytable.myfield > 'A') no se evalúa como verdadero/falso directamente y de hecho es evaluada para cada fila en el momento de la selección. Entiendo que esto es lo que permite que estas expresiones se utilicen como objetos de consulta e incluso se combinen.

He tratado de encontrar una respuesta a esto en línea pero no pude, así que aquí está mi pregunta: ¿Cómo es que esas expresiones de consulta no están evaluando a True/False de inmediato? ¿Por qué el valor de myquery no es, por ejemplo, True? ¿Qué función de Python que probablemente estoy perdiendo permite que esto funcione?

Respuesta

7

Las otras respuestas tienen, pero sólo para proporcionar un poco más específica web2py-detalle:

db.mytable.myfield > 'A' 

db.mytable.myfield es una instancia de la clase web2py DAL Field, que hereda de la clase DAL Expression. La clase Expression sí sobrecarga un número de operadores de Python, como ==, <, >, etc. Estos operadores sobrecargados, cuando se aplica a Expression (y por lo tanto Field) objetos devolver una instancia de la clase DAL Query en lugar de un objeto Boolean estándar Python . Aquí está el source code para el operador > (__gt__).

Ver here para más información sobre sobrecarga del operador en Python.

2

Cualquier operador aplicado a objetos personalizados (no incorporados) según la evaluación de special methods. Es ampliamente conocido como operator overloading. Así que, básicamente definición de clase de campo se parecían:

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

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