web2py查询表达式如何工作?

ntp*_*tpl 5 python web2py

我刚才有机会看看web2py框架,虽然我有一些Django的经验,而且对于普通的Python更是如此,但我无法理解web2py使用的Query系统.

让我们从web2py书中获取这个例子

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

在一篇SO评论中, web2py作者说,(db.mytable.myfield > 'A')它不会直接评估为True/False,而是在选择时对每一行进行实际评估.我理解这是允许这些表达式用作查询对象甚至组合的原因.

我试图在网上找到答案,但不能,所以这是我的问题:这些查询表达式如何不立即评估为True/False?为什么myquery的值不是,比如说,True?我可能缺少哪些Python功能允许它工作?

Ant*_*ony 7

其他答案有它,但只是为了提供更多web2py特定的细节:

db.mytable.myfield > 'A'
Run Code Online (Sandbox Code Playgroud)

db.mytable.myfield是web2py DAL Field类的实例,它继承自DAL Expression类.所述Expression类本身重载一些Python的运营商,例如==,<,>等.这些重载操作,当施加到Expression(因此Field)对象返回DAL的实例Query类,而不是标准的Python布尔对象.下面是源代码>(__gt__)运算符.

有关Python中运算符重载的更多信息,请参见此处.