Mi editor me advierte cuando comparo my_var == None, pero no me avisa cuando lo uso my_var is None.
Hice una prueba en el shell de Python y determiné que ambas son una sintaxis válida, pero mi editor parece estar diciendo que my_var is Nonees preferible.
¿Es este el caso, y si es así, por qué?
python
comparison
nonetype
Clay Wardell
fuente
fuente

is- python.org/dev/peps/pep-0008/#programming-recommendationsRespuestas:
Resumen:
Úselo
iscuando desee verificar la identidad de un objeto (por ejemplo, verificar sivares asíNone). Úselo==cuando desee verificar la igualdad (por ejemplo, esvarigual a3?).Explicación:
Puede tener clases personalizadas donde
my_var == NonevolveráTruep.ej:
iscomprueba la identidad del objeto . Solo hay 1 objetoNone, así que cuando lo hacesmy_var is None, estás verificando si realmente son el mismo objeto (no solo equivalente objetos )En otras palabras,
==es una verificación de equivalencia (que se define de un objeto a otro) mientras queisverifica la identidad del objeto:fuente
is Nonedifiere de== None?__eq__se puede definir de cualquier manera, pero el comportamiento deisno se puede cambiar tan fácilmente.is". Después de un comentario en las listas, cambió eso a "... inclusois(pero solo si estás loco)".object == Nonerealmente sea el idioma correcto (aunque no puedo pensar en ninguno fuera de mi cabeza). Solo necesitas saber lo que estás haciendo.isgeneralmente se prefiere cuando se comparan objetos arbitrarios con singletons comoNoneporque es más rápido y más predecible.issiempre se compara por identidad de objeto, mientras que lo==que hará dependerá del tipo exacto de los operandos e incluso de su orden.Esta recomendación es respaldada por PEP 8 , que establece explícitamente que "las comparaciones con singletons como None siempre deben hacerse con
isois not, nunca, los operadores de igualdad".fuente
Noneobjeto debajo de la constante globalNone. En todo caso,NoneTypees un detalle de implementación porque elNonesingleton debe tener algún tipo. (El hecho de que no pueda crear instancias de este tipo es una buena indicación de que su única instancia está destinada a ser un singleton.)None, utilice todos los mediosobj == None. Si desea verificar si un objeto esNone, useobj is None. El punto de la recomendación de PEP 8 (y de esta respuesta) es que la mayoría de las personas quieren este último cuando quieren verificar Ninguno, y también resulta ser más rápido y más claro.NoneTambién es diferente de los objetos en caché como0y otros enteros pequeños, donde el almacenamiento en caché es realmente un detalle de implementación. La diferencia es que un número entero tiene un valor intrínseco que le da sus propiedades y puede calcularse. Por otro lado,Noneno tiene ningún tipo de estado, es solo su identidad lo que importa y lo hace especial.PEP 8 define que es mejor usar el
isoperador al comparar singletons.fuente