2012-02-26 6 views
36

La respuesta here proporciona una referencia manual para los casos en los que desea __ne__ para devolver algo que no sea la inversa lógica de __eq__, pero no puedo imaginar ningún caso. ¿Algún ejemplo?¿Por qué Python tiene un método de operador __ne__ en lugar de solo __eq__?

+7

Al menos para '>' y '<=' hay tales casos. A saber 'NaN < anything => falso' y' NaN> = anything => false'. (Suponiendo que Python sigue la lógica de punto flotante IEEE) – CodesInChaos

+3

Sí, básicamente, cualquier cosa que no tenga un [orden total] (http://en.wikipedia.org/wiki/Total_ordering) puede caer en esa categoría. Ahora esas cosas son un poco raras por razones obvias, pero existen. NaNs son un buen ejemplo. – Voo

+0

Solo porque puedes. –

Respuesta

28

SQLAlchemy es un gran ejemplo. Para los no iniciados, SQLAlchemy es un ORM y usa la expresión de Python para generar declaraciones de SQL. En una expresión tal como

meta.Session.query(model.Theme).filter(model.Theme.id == model.Vote.post_id) 

la model.Theme.id == model.VoteWarn.post_id no devuelve un valor lógico, sino un objeto que a la larga produce una consulta SQL como WHERE theme.id = vote.post_id. El inverso produciría algo así como WHERE theme.id <> vote.post_id por lo que ambos métodos deben ser definidos.

29

Algunas bibliotecas hacen cosas extravagantes y no devuelven un bool de estas operaciones. Por ejemplo, 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) 

Cuando se compara una matriz a un solo valor o de otra matriz que volvamos una serie de Bools de los resultados de la comparación de los elementos correspondientes. No podría hacer esto si x!=y fuera simplemente equivalente a not (x==y).

+0

No puedo seguir eso. Teniendo en cuenta que 'not' se define en una matriz de bools de la manera obvia, todavía no necesitamos' neq' en lugar de 'not igual'. Pero claramente hay un rendimiento y una posible ventaja de memoria allí. – Voo

+6

Si bien se podría hacer un buen argumento para que un método especial '__not__' anule al operador' no', esto no existe actualmente en Python. – Weeble

+0

Oh, eso es sorprendente ... sí, en ese caso no es solo una cuestión de rendimiento. ¡Gracias! – Voo

8

Más en general, en many valued logic sistemas, equals y not equals no son necesariamente inversos exactos entre sí.

El ejemplo obvio es SQL donde True == True, False == False y Null != Null. Aunque no sé si hay ejemplos específicos de Python, puedo imaginar que se implemente en algunos lugares.

+1

Y en MYSQL, incluso puede tener valores que son 'NULL' y' NOT NULL' al mismo tiempo !!! 1! (Considero que un error de diseño de MySQL) –

Cuestiones relacionadas