La risposta here fornisce un riferimento per la gestione dei casi in cui si desidera che __ne__
restituisca qualcosa di diverso dall'inverso logico di __eq__
, ma non riesco a immaginare un caso del genere. Qualche esempio?Perché Python ha un metodo operatore __ne__ invece di solo __eq__?
risposta
SQLAlchemy è un ottimo esempio. Per chi non lo sapesse, SQLAlchemy è un ORM e utilizza l'espressione Python per generare istruzioni SQL. In un'espressione come
meta.Session.query(model.Theme).filter(model.Theme.id == model.Vote.post_id)
il model.Theme.id == model.VoteWarn.post_id
non restituisce un booleano, ma un oggetto che alla fine produce una query SQL come WHERE theme.id = vote.post_id
. L'inverso produrrebbe qualcosa come WHERE theme.id <> vote.post_id
quindi entrambi i metodi devono essere definiti.
Alcune librerie fanno cose di fantasia e non restituiscono un bool da queste operazioni. Ad esempio, con 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)
Quando si confronta un array a un singolo valore o un'altra matrice si ritorna un array di Caccio dei risultati del confronto delle corrispondenti elementi. Non è possibile farlo se x!=y
fosse semplicemente equivalente a not (x==y)
.
Non posso seguirlo. Considerando che 'not' è definito su una serie di bool in modo ovvio, non abbiamo ancora bisogno di' neq' invece di 'not equals'. Ma chiaramente c'è una prestazione e un possibile vantaggio di memoria lì. – Voo
Mentre un buon argomento può essere fatto per un metodo speciale '__not__' per sovrascrivere l'operatore' not', questo non esiste attualmente in Python. – Weeble
Oh, questo è sorprendente .. sì, in quel caso non è solo una questione di prestazioni. Grazie! – Voo
Più in generale, nei sistemi many valued logic, equals
e not equals
non sono necessariamente inversi l'uno dell'altro.
L'esempio ovvio è SQL dove True == True
, False == False
e Null != Null
. Anche se non so se ci sono specifici esempi di Python posso immaginarlo implementato in posti.
E in MYSQL, puoi anche avere valori 'NULL' e' NOT NULL' allo stesso tempo !!! 1! (Ritengo che un bug di progettazione di MySQL) –
Almeno per '>' e '<=' ci sono casi del genere. Vale a dire 'NaN < anything => false' e' NaN> = anything => false'. (Supponendo che Python segua la logica in virgola mobile IEEE) – CodesInChaos
In pratica, tutto ciò che non ha un [ordine totale] (http://en.wikipedia.org/wiki/Total_ordering) può rientrare in quella categoria. Ora quelle cose sono piuttosto rare per ovvi motivi, ma esistono. I NaN sono un bell'esempio. – Voo
Solo perché è possibile. –