¿Cuál es el valor de nada?
Me comentaba hoy peralta que había encontrado algo sorprendente sobre Python, observando una tabla que compara el comportamiento del valor nulo en distintos lenguajes de programación. El tema se resume en cinco segundos de consola Python:
>>> None > 10 False >>> None < 10 True
Como yo tampoco sabía por qué salen estos resultados (y además me pico con facilidad con estos temas, todo hay que decirlo), me he puesto a indagar un poco. En la documentación oficial de Python sobre None hay más bien poco, así que he tenido que arremangarme y hurgar un poco por mi cuenta.
En Python, las comparaciones entre objetos se pueden sobrecargar implementando métodos con nombres especiales, como __lt__, __ge__ o __cmp__. No entraré en detalles aburridos sobre ellos, principalmente porque he visto que el objeto None no tiene ninguno de ellos implementado (amo la función dir(), no puedo vivir sin ella).
Sin documentación, y sin pistas en el propio objeto acerca de dónde o cómo se hace la comparación, sólo quedaba un sitio donde mirar: ¡el código fuente! Después de un rato de desorientación y tirando de grep he conseguido llegar al quid de la cuestión, en el fichero Objects/object.c.
static int default_3way_compare(PyObject *v, PyObject *w) { int c; const char *vname, *wname; if (v->ob_type == w->ob_type) { /* Edito este trozo que no nos interesa ahora */ } /* None is smaller than anything */ if (v == Py_None) return -1; if (w == Py_None) return 1; /* Lo que queda tampoco nos interesa */ }
¡Por fin! Parece ser que cuando el intérprete no encuentra sobrecargas en los métodos, acaba llamando a una función de comparación genérica que intenta hacer algo más o menos sensato en función de los tipos de los objetos a comparar. Es una función al estilo de strcmp(), que devuelve -1 si el primer elemento es menor, 1 si es mayor y 0 si son iguales. Y ahí, claro como el agua, encontramos la respuesta que estábamos buscando: «None is smaller than anything».
1 comentario
Comments RSS
TrackBack Identifier URI
Dejar un comentario

