8

Trong Google AppEngine NDB there are queries như thế này:Tại sao tham số biểu thức python này không được mở rộng tại thời gian gọi?

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

Tại sao các biểu hiện Account.userid >= 40 không mở rộng vào thời điểm cuộc gọi đến đúng hay sai trước khi thông qua như là một cuộc tranh cãi? Biểu thức lọc được chuyển đến truy vấn như thế nào? Nó được thực hiện với quá tải nhà điều hành?

+2

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. –

+0

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

+3

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

Trả lời

1

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.

Các vấn đề liên quan