Python操作符也是一种函数
最近在学习SQLAlchemy,发现它的sql查询的filter是这么写的:
rows = session.query(User).filter(User.name=='Tom').all()
其中filter把User.name=='Tom'
这个表达式当成参数我是没想到的,表达式的返回值不是True或False吗?各种百度谷歌之后我找到这么一个答案:
python中的操作符也是一种函数
很神奇对不对,相信下面一段代码可以解释这个答案
class A(object):
def __eq__(self, other):
print("equal",other)
def __getitem__(self, item):
print("getitem",item)
if __name__ == '__main__':
A.__eq__(A, 'B') #equal B
A.__getitem__(A, 'B') #getitem B
a = A()
a == 'b' #equal b
a['b'] #getitem b
这里的==
和[]
平时分别是用于相同判断和字典取值的,在这里对__eq__()
和__getitem__()
重新定义后,这两个符号(函数)的功能也就发生了变化。
分析至此,我们上面提到的sqlalchemy中的filter功能也就不难理解了。那么在我看来,其filter功能大致和以下代码中的filter函数功能类似:
class Field(object):
def __init__(self,key):
self.key = key
def __eq__(self, other):
return '%s = %r'%(self.key, other)
def __lt__(self, other):
return '%s < %r'%(self.key,other)
class User(object):
name=Field('name')
age=Field('age')
def filter(str):
return querySql(str)
def querySql(str):
res = str #看成str处理后的结果
return res
if __name__ == "__main__":
print(filter(User.name == 'zhang'))
print(filter(User.age < 20))
其中User用于定义数据模型,Field为字段模型,querySql为数据库查询函数。
以上,filter函数就可以经由上面传入的表达式来达到查询效果。
上述代码输出如下:
name = 'zhang'
age < 20