Siempre he pensado que la if not x is None
versión es más clara, pero la guía de estilo de Google y el PEP-8 los usan if x is not None
. ¿Hay alguna diferencia de rendimiento menor (supongo que no), y ¿hay algún caso en el que uno realmente no encaja (haciendo que el otro sea un claro ganador para mi convención)? *
* Me refiero a cualquier singleton, en lugar de solo None
.
... para comparar singletons como None. El uso es o no es.
python
coding-style
boolean-expression
orokusaki
fuente
fuente
is not
es un operador por derecho propio. Al igual!=
. Si lo prefiere,not x is None
entonces también debería preferirnot a == b
mása != b
.not x is None
(las respuestas aquí me convencieron); sin embargo, vale la pena señalar quenot a == b
es el estilo preferido en Python en comparación cona != b
.not a == b
realmente el estilo preferido? Nunca lo había visto de esa manera y en todas partes que uso la gente lo usa!=
.!=
en lugar de dos operadoresnot
,==
.Respuestas:
No hay diferencia de rendimiento, ya que compilan al mismo código de bytes:
Estilísticamente, trato de evitar
not x is y
. Aunque el compilador siempre lo tratará comonot (x is y)
, un lector humano podría malinterpretar la construcción como(not x) is y
. Si escribo,x is not y
entonces no hay ambigüedad.fuente
x is (not y)
. Pero tiendo a estar de acuerdo contigo para tu otro razonamiento.La guía de estilo de Google y Python es la mejor práctica:
El uso
not x
puede causar resultados no deseados.Vea abajo:
Puede que le interesen para ver qué literales son evaluados para
True
oFalse
en Python:Editar para comentar a continuación:
Acabo de hacer algunas pruebas más.
not x is None
no niegax
primero y luego se compara conNone
. De hecho, parece que elis
operador tiene una mayor prioridad cuando se usa de esa manera:Por lo tanto,
not x is None
es, en mi sincera opinión, mejor evitarlo.Más edición:
Acabo de hacer más pruebas y puedo confirmar que el comentario de bukzor es correcto. (Al menos, no pude demostrarlo de otra manera).
Esto significa que
if x is not None
tiene el resultado exacto comoif not x is None
. Estoy corregido. Gracias bukzorSin embargo, mi respuesta sigue en pie: use lo convencional
if x is not None
.:]
fuente
El código debe escribirse para que el programador lo entienda primero y luego el compilador o el intérprete. La construcción "no es" se parece más al inglés que "no es".
fuente
TLDR: el compilador de bytecode los analiza a ambos, por
x is not None
lo que, por razones de legibilidad, úselosif x is not None
.Legibilidad
Usamos Python porque valoramos cosas como la legibilidad humana, la usabilidad y la corrección de varios paradigmas de programación sobre el rendimiento.
Python optimiza la legibilidad, especialmente en este contexto.
Analizar y compilar el código de bytes
Se
not
une más débilmente queis
, por lo que no hay diferencia lógica aquí. Ver la documentación :El
is not
se proporciona específicamente en la gramática de Python como una mejora de legibilidad para el lenguaje:Y, por lo tanto, también es un elemento unitario de la gramática.
Por supuesto, no se analiza igual:
Pero entonces el compilador de bytes realmente traducirá el
not ... is
ais not
:Entonces, en aras de la legibilidad y el uso del lenguaje como estaba previsto, utilícelo
is not
.No usarlo no es sabio.
fuente
not
une más débilmente queis
, por lo que no hay diferencia lógica aquí", excepto que Python no tiene que imponer identidades lógicas y algebraicas para mantener (no hay razón intrínseca para(1 + 2)*3
evaluar lo mismo1*3 + 2*3
). Aquí aparentemente Python está engañando y optimizandoUNARY_NOT
.La respuesta es más simple de lo que la gente lo hace.
No hay ventaja técnica de ninguna manera, y "x no es y" es lo que todos los demás usan , lo que lo convierte en el claro ganador. No importa que "se parezca más al inglés" o no; todos lo usan, lo que significa que todos los usuarios de Python, incluso los usuarios chinos, cuyo lenguaje Python no se parece en nada, lo entenderán de un vistazo, donde la sintaxis un poco menos común tomará un par de ciclos cerebrales adicionales para analizar.
No seas diferente solo por el hecho de ser diferente, al menos en este campo.
fuente
Se
is not
prefiere al operador antes que negar el resultadois
por razones estilísticas. "if x is not None:
" se lee igual que el inglés, pero "if not x is None:
" requiere la comprensión de la precedencia del operador y no se lee como el inglés.Si hay una diferencia en el rendimiento, mi dinero está en
is not
juego, pero esto casi seguramente no es la motivación para la decisión de preferir esa técnica. Obviamente dependería de la implementación. Comois
no se puede anular, de todos modos debería ser fácil optimizar cualquier distinción.fuente
Personalmente, yo uso
lo cual es entendido inmediatamente sin ambigüedad por todos los programadores, incluso aquellos que no son expertos en la sintaxis de Python.
fuente
if not x is None
es más similar a otros lenguajes de programación, peroif x is not None
definitivamente me parece más claro (y es más gramaticalmente correcto en inglés).Dicho esto, parece que es más una preferencia para mí.
fuente
Preferiría la forma más legible
x is not y
de lo que pensaría cómo eventualmente escribir la precedencia de manejo de código de los operadores para producir un código mucho más legible.fuente