Ignacio là chính xác, mã NDB đang xác định phương pháp ma thuật tùy chỉnh trên Property
class để kiểm tra so sánh. Các chức năng này (__eq__
, __ne__
, __lt__
, v.v.) đều đang gọi this custom _comparison
function dưới mui xe.
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)
Như bạn có thể thấy, các mã không trả lại kết quả boolean, nó sẽ trả về một thể hiện của FilterNode
mà bản thân để đánh giá một giá trị truthy/falsey một cách thích hợp cho việc so sánh.
Biểu thức Account.userid >= 40
không được mở rộng vào thời gian cuộc gọi thành đúng hay sai trước khi được chuyển làm đối số?
Về mặt kỹ thuật, việc mở rộng/đánh giá trước khi hàm query()
được gọi, nó không được đánh giá thành giá trị boolean.
Nguồn
2017-11-09 23:18:44
Có lẽ do toán hạng LH là một đối tượng xác định các phương pháp ma thuật phù hợp. –
Vâng, đó là những gì tôi có nghĩa là bởi quá tải nhà điều hành. Có vẻ tiện lợi, nhưng cũng khó hiểu. – Tom
Có thể trùng lặp của [Làm thế nào là ndb.StringProperty bằng một chuỗi python?] (Https://stackoverflow.com/questions/46545125/how-is-ndb-stringproperty-equals-a-python-string) – snakecharmerb