下面的代码是如何工作的?
result = session.query(Customers).filter(Customers.id == 2)
Run Code Online (Sandbox Code Playgroud)
根据我不扎实的 Python 知识,Customers.id == 2函数调用中使用的语法不是有效的吗?或者这样的foo == bar语法将首先将 eval 转换为布尔值,然后调用.filter(True/False).
回复你的陈述:
或者这样的
foo == bar语法将首先被 eval 为布尔值
您可以使用dunder 方法(以及具有同样适当命名的方法的其他运算符)来覆盖相等运算符。__eq__
例如,以下代码显示了如何使使用该类的任何人感到困惑,除非他们是量子物理学家,深谙事物可以同时死和活的事实:
class Confusing(object):
def __eq__(self, other): return True
def __ne__(self, other): return True
deadCat = Confusing()
liveCat = Confusing()
if (deadCat == liveCat and deadCat != liveCat):
print("Superposition of meow and deathly silence")
Run Code Online (Sandbox Code Playgroud)
在你的情况下,Customers.id是一种Column类型。我没有查看具体的 SqlAlchemy 代码,但Column.__eq__()几乎肯定会返回一些过滤对象,而不是一个简单的True/False值,然后将filter()其传递给从query().
这是该概念的一个大大简化的变体,当您有一个可以添加到的键/值集合时,并且相等检查的结果是具有所请求值的所有键的列表:
class KeyValCollection(object):
def __init__(self):
self._keyVals = []
def add(self, key, val):
self._keyVals += [(key, val)]
def __eq__(self, compVal):
return [item[0] for item in self._keyVals if item[1] == compVal]
x = KeyValCollection()
x.add("pax", 42)
x.add("arthur", 43)
x.add("bill", 42)
x.add("carl", 44)
x.add("david", 42)
print(x == 42)
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,其输出既不是也不True是False:
['pax', 'bill', 'david']
Run Code Online (Sandbox Code Playgroud)