[pyar] Duda con isinstance

Alejandro Santos listas en alejolp.com
Mie Jun 16 19:11:14 ART 2010


2010/6/16 Pablo Hernan Rodriguez Zivic <elsonidoq en gmail.com>:
> Hola!
>
> Me esta pasando algo extraño usando isinstance.
>
> Suponganse que tengo un paquete que se llama sandbox, y adentro tengo un
> archivo test.py con una clase dummy:
>
> Class Test(object): pass
>
> Si levanto un interprete de python pasa algo muy curioso:
>
> In [1]: from test import Test
>
> In [2]: e= Test()
>
> In [3]: isinstance(e, Test)
> Out[3]: True
>
> In [4]: from sandbox.test import Test
>
> In [5]: isinstance(e, Test)
> Out[5]: False
>
> Es un bug, o es que no estoy usando bien isinstance?

Te picó un bug muy raro, pero no es un bug, ya fue reportado y marcado
como inválido:

http://bugs.python.org/issue1249615

Basicamente si importás un modulo desde dos lugares disntintos, y cada
uno de esos usa dos rutas distintas del sys.path, Python asume que son
distintas.

Con eso asumo que isinstance devuelve false si Test.__module__ y
e.__class__.__module__ son diferentes. Fijate al final de todo y el
id() de las clases accedidas de diferentes formas:

>>> from test import Test
>>> e = Test()
>>> isinstance(e, Test)
True
>>> import sys
>>> sys.path.insert(0, '..')
>>> from sandbox.test import Test
>>> isinstance(e, Test)
False
>>> Test
<class sandbox.test.Test at 0x7fe3e5df0770>
>>> e.__class__
<class test.Test at 0x7fe3e5df0710>
>>> import test
>>> import sandbox
>>> sandbox.test
<module 'sandbox.test' from '../sandbox/test.pyc'>
>>> test
<module 'test' from 'test.py'>
>>> Test.__module__
'sandbox.test'
>>> e.__class__.__module__
'test'



-- 
Alejandro Santos
http://www.alejolp.com.ar



More information about the pyar mailing list