[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