Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> None > 0 False >>> None == 0 False >>> None < 0 True
None
utiliza operadores aritméticos bien definidos para los tipos incorporados (enteros en este caso)? La única comparación significativa que realmente puede usar con None
es if obj is None:
(o if obj is not None:
.
Python 3 ha eliminado la comparación entre los diferentes tipos por buenas razones: eran una fuente común de errores y causaban confusión. Por ejemplo
>>> "3" < 4 False
En Python 3, obtienes un TypeError
al comparar valores de diferentes tipos como str
contra int
o cualquier cosa contra None
.
>>> None < 0 Traceback (most recent call last): File "", line 1, in TypeError: unorderable types: NoneType() < int()
(Me refiero a "comparar" en el sentido de tratar de determinar cuál de los dos valores es mayor / menor. La comparación para la igualdad es correcta: siempre devolverá False
si dos objetos son de diferentes tipos).
No he encontrado una referencia en los documentos para esto, pero en Learning Python, 4ª edición , Mark Lutz escribe en la página 204:
[...] Las comparaciones de objetos tipificados de manera diferente (p. Ej., Una cadena y una lista) funcionan: el lenguaje define una ordenación fija entre los diferentes tipos, que es determinista, si no es estéticamente agradable. Es decir, el orden se basa en los nombres de los tipos involucrados: todos los enteros son menos que todas las cadenas, por ejemplo, porque
"int"
es menor que"str"
.
Algunas citas interesantes de http://bytes.com/topic/python/answers/801701-why-none-0-a
A principios de Python, se tomó la decisión de que la comparación de cualquiera de los dos objetos era legal y devolvería un resultado consistente. Por lo tanto, los objetos de diferentes tipos se compararán según una ordenación en sus tipos (una implementación dependiente, no especificada, pero consistente) y los objetos del mismo tipo se compararán de acuerdo con las reglas que tengan sentido para ese tipo.
Otras implementaciones tienen el derecho de comparar un entero y ninguno de manera diferente, pero en una implementación específica, el resultado no cambiará.
Python 3 generará una excepción en tales comparaciones.
y
El problema es el típico; Python originalmente no tenía un tipo booleano, y la modificación resultó en una semántica extraña. C tiene el mismo problema.