2015-06-11 18 views
8

Ich frage mich über den Grund für einen ungleich Operator in python.Warum gibt es einen nicht gleich Operator in Python

Die snipped folgende:

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) 

Ausgänge:

Equal called 
True 
Not equal called 
True 
Equal called 
False 

Ist das nicht eigentlich eine Menge Ärger einladen, indem möglicherweise sagen:

A == B and A != B 

kann die richtige sein gleiche Zeit. Darüber hinaus birgt dies eine potentielle Falle, wenn man vergisst, __ne__ zu implementieren.

+0

Optimierung? Und das ist gegen Verträge. –

+8

* "Es gibt keine impliziten Beziehungen zwischen den Vergleichsoperatoren. Die Wahrheit von' x == y 'impliziert nicht, dass' x! = Y 'falsch ist. Dementsprechend sollte man bei der Definition von '__eq __()' auch 'definieren __ne __() 'damit sich die Operatoren wie erwartet verhalten." * – CoryKramer

+0

@CoryKramer Woher kommt es? – vmonteco

Antwort

-1

Scheint, dass Sie True zurückgeben, anstatt den Vergleich zu machen.

+1

Er hat eigentlich kein Problem mit seinem Code-Snippet. Er fragt, warum die Sprache so gestaltet ist, wie sie ist. – Kevin

+0

Sie taten das absichtlich, um einen Punkt zu beweisen.Python erlaubt es Ihnen, logische Widersprüche zu begehen – CoryKramer

+0

Ich denke, das ist Absicht. – vmonteco

7

Je nach Bedarf gibt es Fälle, in denen Gleichheit und Ungleichheit nicht entgegengesetzt sind; In der überwiegenden Mehrzahl der Fälle sind sie jedoch entgegengesetzt. Wenn Sie also in Python 3 keine Methode __ne__ angeben, invertiert Python die Methode __eq__ für Sie.

Wenn Sie Code schreiben, der sowohl auf Python 2 als auch auf Python 3 ausgeführt wird, sollten Sie beide definieren.

+0

NaN war auch mein erster Gedanke, aber ich habe es gerade getestet und ich kann mir keinen Fall einfallen lassen, bei dem die beiden Vergleiche keine entgegengesetzten Ergebnisse liefern. –

+0

Hm, ich stimme nicht zu. Es sollte von der Bibliothek definiert werden, wenn NaN gleich einer beliebigen Anzahl von nicht ist. Ich stimme jedoch dem zweiten Punkt zu, außer wenn es noch eine potentielle Fallgrube ist. –

+0

@MarkRansom: Ah, richtig, danke. Dieser Punkt wurde behoben. –

1

Per der data model documentation, die die „magische Methoden“ deckt Sie auf Klassen (Hervorhebung von mir) implementieren können:

Es gibt keine implizite Beziehung zwischen den Vergleichsoperatoren. Die Wahrheit von x==y bedeutet nicht, dass x!=y falsch ist. Dementsprechend, wenn definiert __eq__(), sollte man auch definieren __ne__(), so dass die Betreiber verhalten sich wie erwartet.

+0

Ich würde gerne ein praktisches Beispiel sehen, wo es nützlich ist, dass sich '__eq__' und' __ne__' inkonsistent verhalten. –

+1

@MarkRansom Wie wäre es mit 'numpy', wobei' == 'und'! = 'Auf Arrays Arrays von booleschen elementweisen Vergleichen erzeugen? 'x! = y 'gibt ein Array,' nicht x == y' gibt einen 'ValueError'! – jonrsharpe

Verwandte Themen