[Python-es] Tipos en python (Re: Contar en lista)

Chema Cortes pych3m4 en gmail.com
Jue Nov 18 02:44:13 CET 2010


El día 17 de noviembre de 2010 20:06, Milton Galo Patricio Inostroza
Aguilera <minoztro en gmail.com> escribió:
> El día 17 de noviembre de 2010 14:25, Chema Cortes <pych3m4 en gmail.com> escribió:
>> Este modo de ver los tipos me "chirría" mucho. Que los nodos AST
>
> ¿Qué significa "cirría"?

"Chirriar" es la onomatopeya del ruido agudo que hacen los ejes
desencajados de un coche de caballos. Equivaldría a "desafinado".

>> tengan "referencias" a objetos no implica que la "referencia" sea el
>> tipo "estático" existente. Para cada tipo "estándar" hay siempre en
>
> Creo que hay una confusión...yo dije que están "etiquetados", es decir
> se dice que lo que se tiene es una función para que el sistema cuando
> encuentre un número lanze un mensaje acorde con el error y no un
> segmentation fault.  En ninguna momento quize decir que se guarda una
> referencia (instancia de un objeto?) en el AST.

Me falta teoría general sobre ST/AST para poder seguirte. En todo
caso, no siempre los tipos de datos que se usan en los nodos AST
coinciden con los tipos de datos del lenguaje. Un ejemplo:

>>> 1.__int__
  File "<stdin>", line 1
    1.__int__
            ^
SyntaxError: invalid syntax

>>> getattr(1,"__int__")
<method-wrapper '__int__' of int object at 0x981ed68>
>>> hex(id(1))
'0x981ed68'
>>>

En el primer caso, el analizador sintáctico toma a '1' como de tipo
'integer' en lugar de tipo 'object', lo que provoca error "sintáctico"
al acceder a los atributos (BTW, ruby no produce este error).
En el segundo caso se comprueba que el objeto '1' existe, es de tipo
'int' y se accede a sus métodos sin problemas.

En cambio:

>>> 1.0.__int__
<method-wrapper '__int__' of float object at 0x98279a4>
>>> 1.0.__int__
<method-wrapper '__int__' of float object at 0x98279b4>

No da errores sintácticos porque '1.0' es considerado por AST como de
tipo 'object'. (A su vez puede verse que no siempre se accede al mismo
objeto cada vez).


Más información sobre la lista de distribución Python-es