2012-02-26 7 views
36

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__?

+7

Í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

+3

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

+0

Chỉ vì bạn có thể. –

Trả lời

28

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.

29

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

+0

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

+6

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

+0

Ồ 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

8

Nói chung, trong các hệ thống many valued logic, equalsnot 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 == FalseNull != 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.

+1

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ù) –