Tengo el siguiente código:¿Python coacciona los tipos al realizar una sobrecarga del operador?
a = str('5')
b = int(5)
a == b
# False
Pero si hago una subclase de int
, y reimplementar __cmp__
:
class A(int):
def __cmp__(self, other):
return super(A, self).__cmp__(other)
a = str('5')
b = A(5)
a == b
# TypeError: A.__cmp__(x,y) requires y to be a 'A', not a 'str'
¿Por qué estos dos diferentes? ¿El tiempo de ejecución de Python captura el TypeError lanzado por int.__cmp__()
, e interpretándolo como un valor de False
? ¿Puede alguien señalarme un poco en la fuente 2.x cpython que muestra cómo funciona esto?
En una nota al margen: ¿sabes que '__cmp__' estaba en desuso hace siglos? Debe implementar funciones de comparación enriquecida. – Bakuriu
Sí, esto surgió cuando estaba tratando de averiguar si debería presentar una excepción o devolver NotImplemented en una implementación de __eq__. Quería ver lo que hacían las clases integradas de Python, y encontré este ejemplo que parecía inconsistente. – Chris