2015-06-11 15 views
8

Tôi đã tự hỏi về lý do có toán tử không bằng nhau trong python.Tại sao có một toán tử không bằng nhau trong python

Sau đây snipped:

class Foo: 
    def __eq__(self, other): 
     print('Equal called') 
     return True 

    def __ne__(self, other): 
     print('Not equal called') 
     return True 

if __name__ == '__main__': 
    a = Foo() 

    print(a == 1) 
    print(a != 1) 
    print(not a == 1) 

kết quả đầu ra:

Equal called 
True 
Not equal called 
True 
Equal called 
False 

Không điều này thực sự mời rất nhiều rắc rối bởi khả năng nói:

A == B and A != B 

có thể đúng ở cùng một lúc. Hơn nữa điều này giới thiệu một cạm bẫy tiềm năng khi quên thực hiện __ne__.

+0

Tối ưu hóa? Và điều này là trái với hợp đồng. –

+8

* "Không có mối quan hệ ngụ ý giữa các toán tử so sánh. Sự thật của' x == y' không ngụ ý rằng 'x! = Y' là sai. Theo đó, khi định nghĩa' __eq __() ', ta cũng nên xác định' __ne __() 'để các toán tử hoạt động như mong đợi." * – CoryKramer

+0

@CoryKramer Nó ở đâu? – vmonteco

Trả lời

-1

Có vẻ như bạn đang quay trở lại True thay vì thực hiện so sánh.

+1

Anh ấy không thực sự gặp sự cố với đoạn mã của mình. Anh ấy hỏi tại sao ngôn ngữ được thiết kế theo cách của nó. – Kevin

+0

Họ đã cố ý để chứng minh một điểm.Python cho phép bạn thực hiện các mâu thuẫn logic – CoryKramer

+0

Tôi nghĩ đó là cố ý. – vmonteco

7

Tùy thuộc vào nhu cầu của một người có những trường hợp bình đẳng và không bằng nhau không đối diện; tuy nhiên, phần lớn các trường hợp chúng ngược lại, vì vậy trong Python 3 nếu bạn không chỉ định phương thức __ne__, Python sẽ đảo ngược phương thức __eq__ cho bạn.

Nếu bạn đang viết mã để chạy trên cả Python 2 và Python 3, thì bạn nên xác định cả hai.

+0

NaN cũng là suy nghĩ đầu tiên của tôi, nhưng tôi chỉ thử nghiệm nó và tôi không thể nghĩ ra một hoàn cảnh mà hai so sánh này không trả lại kết quả ngược lại. –

+0

Hm, tôi không đồng ý. Nó phải được định nghĩa bởi thư viện nếu NaN bằng với bất kỳ số nào không. Tôi đồng ý với điểm thứ hai mặc dù, ngoại trừ khi subclassing nó vẫn là một pitfall tiềm năng. –

+0

@MarkRansom: Ah, phải, cảm ơn. Sửa lỗi đó. –

1

mỗi sự data model documentation, trong đó bao gồm các "magic method" bạn có thể thực hiện trên lớp (tôi nhấn mạnh):

Không có mối quan hệ ngụ ý giữa các toán tử so sánh. Các sự thật của x==y không hàm ý rằng x!=y là sai. Theo đó, khi xác định __eq__(), bạn cũng nên xác định __ne__() để các toán tử hoạt động như mong đợi.

+0

Tôi rất muốn xem một ví dụ thực tế hữu ích khi có '__eq__' và' __ne__' hoạt động không nhất quán. –

+1

@MarkRansom làm thế nào về 'numpy', trong đó' == 'và'! = 'Trên mảng tạo mảng của so sánh nguyên tố boolean-khôn ngoan? 'x! = y' cho một mảng,' không x == y' đưa ra một 'ValueError'! – jonrsharpe

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