agregar un campo a object - ex [id de objetos]

Chema Cortes py en ch3m4.org
Jue Mayo 1 04:07:14 CEST 2008


El Thursday 01 May 2008 01:02:27 Milton Galo Patricio Inostroza Aguilera 
escribió:
> Estimados:
>
>    Hace ya un tiempo que estoy construyendo un depurador omnisciente
> [1] para python.  Todo ha ido de maravillas hasta que me he topado con
> el siguiente requerimiento:
>
> * Cada objeto que se cree deberá tener un identificador único dentro
> del programa
>
> [...]
>
> Ejemplo de lo que necesito:
>
> 1 def fun():
> 2     a = [] #
> 3     a.append(3)
>
> lo que hace el depurador hasta el momento es:
>
> 1) detecta el call de fun, para esto utilizo settrace
>     1) se registra la funcion
>     2) se inspecciona el bytecode del frame a través de frame.f_code
>     3) se crea un mapa del bytecode con los índices para poder manejar
> los cambios del f_lasti
>
> 2) detecta la linea 2 a través del evento line del settrace
>     2.1) se pregunta en el mapa creado, por el f_lasti actual si es
> que en la anterior instrucción se encontró un store_fast,
>            de ser así, se registra el nombre de la variable local y
> luego si id = numero que esta en el bytecode que es la posición que
> ocupa en co_varnames {acá aun no se toma en cuenta las variables
> libres y las que están ligadas}
>     2.2) registra la variable local
>     2.3) Se detecta una modificación en el valor de la variable local
> a, entonces se registra ese evento y se debe enviar el nuevo valor de
> la variable a.  Si el valor es un int, string, float, etc podemos
> mandar el valor solamente....pero si es una lista, tupla u otro objeto
> no puedo enviar el valor si no que el identificador único que se debe
> generar al momento de construir en este caso el objeto lista.

En algunos mensajes míos en esta lista podrás ver, en lo relativo al lenguaje 
python, que siempre he sido contrario al concepto de ver las "variables" 
como "almacenes" de datos. La variable 'a' no toma un valor; lo que hace en 
realidad es referenciar un objeto que está en memoria, sin determinar cuándo 
se creó (ni cuándo se destruirá).

Si yo hago:

 a=b=1

no estoy creando dos objetos; lo curioso es que ni siquiera se está creando 
uno, ya que en python hay una serie de objetos que siempre existen, aunque no 
se usen, como son los números enteros desde -1 a 256 y los elementos vacíos 
() [] {}

En cuanto a lo que quieres hacer, aunque lo entiendo, veo complicado su 
control. Por ejemplo, el cambio de los elementos de una lista no se puede 
entender como que la lista cambia.

Por ejemplo:

l1=[1,2,3]
l2=[l1]
l1.append(4)

En el último paso ha cambiado l1, pero ¿se puede decir que haya cambiado 
también l2?


Por otro lado, el object.c define la base de las nuevas clases, las que 
unifican tipos y clases. Aún existen las viejas clases, que van por otro 
lado:

class P:
  pass

issubclass(P,object) --> False


No sabría cómo concretar mi ayuda. Aún así se me ocurren un par de cosas:

- considera las listas de igual modo que el paso de variables por referencia, 
no como a objetos normales (eg: similar al Object& de C++)

- guarda siempre una referencia a todo objeto, de este modo podrás seguir 
usando el id() sin riesgo a que se repita (a costa de requerir más memoria). 
Es más, ¿por qué no desactivas totalmente el recolector de basura durante el 
depurado? (gc.disable()). No hace falta que te advierta de la cantidad de 
memoria que vas a necesitar.
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.python.org/pipermail/python-es/attachments/20080501/81184351/attachment.pgp>
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


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