为什么这个python表达式参数在调用时没有扩展?

时间:2017-11-09 14:03:41

标签: python function google-app-engine arguments parameter-passing

在google appengine NDB中there are queries是这样的:

query = Account.query(Account.userid >= 40)

为什么Account.userid >= 40表达式在作为参数传递之前不会在调用时扩展为true或false?过滤器表达式如何传递给查询?是否完成了运算符重载?

1 个答案:

答案 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()函数之前,它正在进行扩展/评估,它只是没有评估为布尔值。