[pyar] Uso de is/is not

Claudio Freire klaussfreire en gmail.com
Lun Jul 19 17:36:46 ART 2010


2010/7/19 QliX=D! [aka EHB] <qlixed en gmail.com>

> Gente,
>   Consulta para los experimentados y "armoniosos del lenguaje" :D, es
> equivalente esto:
>
> if not object is None:
>
> o
>
> if object is not None:
>
> No tengo mucha idea de como lo resuelve el parser en el primer caso...
> es algo como:
> if not(object) is None
> o
> if not (object is None) ???
>

A priori, no es lo mismo... pero es equivalente. "is not" es un operador
binario que devuelve True/False, "not (x is y)" usa el operador "is" y luego
le aplica "not" al resultado. Si el resultado no fuera booleano, el operador
not podría invocar cualquier funcionalidad y no la esperada.

Pero, yendo al bytecode, es lo mismo.

Python tiene un par de transformaciones que optimizan esas comparaciones,
haciendo que ambas versiones sean compiladas al mismo bytecode:

Python 2.6.1 (r261:67515, Oct 16 2009, 11:22:13)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def f(x):
...   return x is not None
...
>>> def g(x):
...   return not (x is None)
...
>>> import dis
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>>

Esto se puede hacer puesto que "is" devuelve y devolverá siempre un
booleano, así que la transformación (not x is y -> x is not y) es siempre
segura, y la hace el compilador de python tras bambalinas.

Así... para aquellos que piensan que python no optimiza... tomá mate ;)
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20100719/365fc0dc/attachment.html>


More information about the pyar mailing list