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__?
Respuesta
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.
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)
.
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
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
Oh, eso es sorprendente ... sí, en ese caso no es solo una cuestión de rendimiento. ¡Gracias! – Voo
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.
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) –
- 1. ¿Por qué el operador = ~ solo a veces tiene efectos secundarios?
- 2. ¿Por qué el lenguaje Python no tiene un método writeln()?
- 3. ¿Cómo se maneja __eq__ en Python y en qué orden?
- 4. ¿Por qué Python dice que pow solo tiene 2 argumentos?
- 5. ¿Por qué Clojure tiene 5 formas de definir una clase en lugar de solo una?
- 6. ¿Por qué la clase python datetime tiene un método 'fromtimestamp', pero no un método 'totimestamp'? clase
- 7. ¿Por qué Mercurial solo tiene un nivel de reversión?
- 8. ¿Por qué el operador% se conoce como el operador "módulo" en lugar del operador "restante"?
- 9. ¿Por qué ArrayList no tiene getSize() en lugar de size()?
- 10. ¿Por qué Java tiene NullPointerException en lugar de NullReferenceException?
- 11. ¿Por qué método equals() cuando tenemos == operador?
- 12. ¿Por qué el tipo de cadena tiene un método .ToString()?
- 13. ¿Por qué analizadores sintácticos en lugar de solo analizadores configurables?
- 14. ¿Por qué auto_ptr <T> tiene operador!() Definido?
- 15. ¿Por qué utilizar un operador de tubería hacia atrás en lugar de cadena de funciones?
- 16. does python tiene un operador de coma como C
- 17. ¿Cuál es un buen ejemplo de un método __eq__ para una clase de colección?
- 18. ¿Por qué usar un método de inicialización en lugar de un constructor?
- 19. ¿Por qué NumPy en lugar de listas de Python?
- 20. ¿Por qué Python no tiene un getattr híbrido + __getitem__ incorporado?
- 21. ¿Por qué XElement no tiene un método GetAttributeValue?
- 22. ¿Por qué C# HashSets tiene un método Distinct()
- 23. ¿Por qué java.io.File no tiene un método close()?
- 24. ¿Por qué ObservableCollection no tiene un método RemoveAll?
- 25. ¿Por qué Python eleva TypeError en lugar de SyntaxError?
- 26. ¿Por qué algunas personas usan el método de clase # en lugar de Class.method en la correspondencia?
- 27. ¿Por qué Python no tiene variables estáticas?
- 28. ¿Por qué el operador postfix ++ tiene mayor prioridad que el operador prefijo ++?
- 29. ¿Por qué la clase Java Pattern usa un método de fábrica en lugar de un constructor?
- 30. ¿Por qué esta agrupación LINQ tiene un recuento de 3 en lugar de 2?
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
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
Solo porque puedes. –