在google appengine NDB中there are queries是这样的:
query = Account.query(Account.userid >= 40)
为什么Account.userid >= 40
表达式在作为参数传递之前不会在调用时扩展为true或false?过滤器表达式如何传递给查询?是否完成了运算符重载?
答案 0 :(得分:1)
Ignacio是正确的,NDB代码在其Property
class上定义自定义魔术方法以进行比较检查。这些功能(__eq__
,__ne__
,__lt__
等)都在调用this custom _comparison
function。
def _comparison(self, op, value):
"""Internal helper for comparison operators.
Args:
op: The operator ('=', '<' etc.).
Returns:
A FilterNode instance representing the requested comparison.
"""
# NOTE: This is also used by query.gql().
if not self._indexed:
raise datastore_errors.BadFilterError(
'Cannot query for unindexed property %s' % self._name)
from .query import FilterNode # Import late to avoid circular imports.
if value is not None:
value = self._do_validate(value)
value = self._call_to_base_type(value)
value = self._datastore_type(value)
return FilterNode(self._name, op, value)
正如您所看到的,代码没有返回布尔结果,它返回FilterNode
的实例,该实例本身会根据比较适当地评估为真值/假值。
为什么
Account.userid >= 40
表达式在作为参数传递之前不会在调用时扩展为true或false?
技术上,在调用query()
函数之前,它正在进行扩展/评估,它只是没有评估为布尔值。