Câu trả lời here đưa ra tham chiếu handwaving cho các trường hợp bạn muốn __ne__
trả về một thứ khác ngoài nghịch đảo logic của __eq__
, nhưng tôi không thể tưởng tượng được bất kỳ trường hợp nào như vậy. Bất kỳ ví dụ nào?Tại sao Python có phương thức toán tử __ne__ thay vì chỉ __eq__?
Trả lời
SQLAlchemy là một ví dụ tuyệt vời. Đối với người không được khởi tạo, SQLAlchemy là một ORM và sử dụng biểu thức Python để tạo các câu lệnh SQL. Trong một biểu thức như
meta.Session.query(model.Theme).filter(model.Theme.id == model.Vote.post_id)
các model.Theme.id == model.VoteWarn.post_id
không trả lại một boolean, nhưng một đối tượng mà cuối cùng tạo ra một truy vấn SQL như WHERE theme.id = vote.post_id
. Nghịch đảo sẽ tạo ra một cái gì đó như WHERE theme.id <> vote.post_id
vì vậy cả hai phương pháp cần phải được xác định.
Một số thư viện làm những điều kỳ lạ và không trả lại một bool từ các hoạt động này. Ví dụ: với numpy:
>>> import numpy as np
>>> np.array([1,2,5,4,3,4,5,4,4])==4
array([False, False, False, True, False, True, False, True, True], dtype=bool)
>>> np.array([1,2,5,4,3,4,5,4,4])!=4
array([ True, True, True, False, True, False, True, False, False], dtype=bool)
Khi bạn so sánh mảng với một giá trị hoặc một mảng khác, bạn lấy lại một mảng các kết quả so sánh các phần tử tương ứng. Bạn không thể làm điều này nếu x!=y
đơn giản chỉ tương đương với not (x==y)
.
Tôi không thể theo dõi điều đó. Xem xét rằng 'không' được định nghĩa trên một mảng các bool theo cách hiển nhiên, chúng ta vẫn không cần' neq' thay vì 'không bằng'. Nhưng rõ ràng có một hiệu suất và lợi thế bộ nhớ có thể có. – Voo
Trong khi một đối số tốt có thể được thực hiện cho phương thức đặc biệt '__not__' để ghi đè toán tử' không', thì điều này hiện không tồn tại trong Python. – Weeble
Ồ thật đáng ngạc nhiên .. vâng trong trường hợp đó, nó không chỉ là vấn đề về hiệu năng. Cảm ơn! – Voo
Nói chung, trong các hệ thống many valued logic, equals
và not equals
không nhất thiết phải là chính xác nghịch đảo của nhau.
Ví dụ hiển nhiên là SQL, nơi True == True
, False == False
và Null != Null
. Mặc dù tôi không biết nếu có bất kỳ ví dụ Python cụ thể tôi có thể tưởng tượng nó được thực hiện ở những nơi.
Và trong MYSQL, bạn thậm chí có thể có các giá trị là 'NULL' và' NOT NULL' cùng một lúc !!! 1! (Tôi nghĩ rằng một lỗi thiết kế của MySQL mặc dù) –
Ít nhất cho '>' và '<=' có những trường hợp như vậy. Cụ thể là 'NaN < anything => false' và' NaN> = bất cứ điều gì => false'. (Giả sử python tuân theo logic dấu chấm động IEEE) – CodesInChaos
Yep về cơ bản, mọi thứ không có [tổng số thứ tự] (http://en.wikipedia.org/wiki/Total_ordering) đều có thể nằm trong danh mục đó. Bây giờ những điều đó rất hiếm vì lý do hiển nhiên, nhưng chúng tồn tại. NaN là một ví dụ điển hình. – Voo
Chỉ vì bạn có thể. –