¿Comparando Ninguno con tipos incorporados usando operadores aritméticos?

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 
  • ¿La comparación None utiliza operadores aritméticos bien definidos para los tipos incorporados (enteros en este caso)?
  • ¿La diferencia entre las dos primeras y la tercera parte de comparación de la especificación de lenguaje (especificación de Python – debe estar bromeando :)) o es el detalle de implementación de CPython?

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.