2012-02-26 2 views
36

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

+7

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

+3

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

+0

Solo perché è possibile. –

risposta

28

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.

29

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

+0

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

+6

Mentre un buon argomento può essere fatto per un metodo speciale '__not__' per sovrascrivere l'operatore' not', questo non esiste attualmente in Python. – Weeble

+0

Oh, questo è sorprendente .. sì, in quel caso non è solo una questione di prestazioni. Grazie! – Voo

8

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.

+1

E in MYSQL, puoi anche avere valori 'NULL' e' NOT NULL' allo stesso tempo !!! 1! (Ritengo che un bug di progettazione di MySQL) –