special getitem dunder __add__ python operator-overloading

getitem - python__add__



¿Por qué Python tiene un método de operador__ne__ en lugar de solo__eq__? (3)

La respuesta here da una referencia manual de los casos en los que desearía que __ne__ devolviera algo distinto a la inversa lógica de __eq__ , pero no puedo imaginar ningún caso. ¿Algún ejemplo?


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 compara una matriz con un solo valor u otra matriz, obtiene una matriz 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) .


De manera más general, en muchos sistemas lógicos valiosos , los equals y not equals no son necesariamente inversos exactos entre sí.

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


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 como

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

the model.Theme.id == model.VoteWarn.post_id no devuelve un booleano, sino un objeto que finalmente produce una consulta SQL como WHERE theme.id = vote.post_id . Lo inverso produciría algo así como WHERE theme.id <> vote.post_id por lo que ambos métodos deben definirse.