python - SQLAlchemy 中的 double equal == 语法如何工作
问题描述
以下代码如何工作?
result = session.query(Customers).filter(Customers.id == 2)
根据我非扎实的 Python 知识,Customers.id == 2
在函数调用中使用的不是有效的语法吗?或者这样的foo == bar
语法将首先 eval 为布尔值,然后调用.filter(True/False)
.
解决方案
重新声明:
或者这样的
foo == bar
语法将首先评估为布尔值
您可以通过使用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")
在您的情况下,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)
正如预期的那样,它的输出既不是True
也不是False
:
['pax', 'bill', 'david']
推荐阅读
- sql - ORACLE SQL 错误 - ORA-02270: 此列列表没有匹配的唯一键或主键
- angular - 使用路由保护 Angular 防止用户返回某些路由
- reactjs - 无法读取 reactjs 中未定义的属性“长度”
- ruby-on-rails - 使用引导模式形式编辑对象(Ruby On Rails)
- python - 如何获取 DRF 序列化程序中相关对象集的属性?
- dagger - 将多个适配器添加到片段中
- python - 为什么 scipy.optimize.check_grad 返回一个数组?
- c++ - 字符串重复被连字符c ++替换
- asp.net-core-signalr - 如果参数的类型应该是抽象类,如何设计参数
- javascript - Javascript中观察到的幂函数