Despistado con weakref y tipos

Chema Cortés py en ch3m4.org
Vie Jun 25 15:11:56 CEST 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Estoy intentando hacer algunas pruebas (algo complejas) con las referencias 
débiles, pero no me funcionan como esperaba.

Quisiera poder crear referencias débiles a clases. Aunque la documentación 
parece que no incluye a las clases como objetos referenciables débilmente, el 
módulo weakref no da ningún error. Mi sospecha es que está tomando las clases 
como instancias de 'type':

>>> import weakref
>>> class C(object):pass
...
>>> p=weakref.ref(C)
>>> p
<weakref at 0x402f6504; to 'type' at 0x81b5f8c (C)>
>>> del C
>>> p
<weakref at 0x402f6504; to 'type' at 0x81b5f8c (C)>


Usando las clases antiguas, directamente da un error al crear la referencia, 
por lo que confirma mis sospechas de que un tipo pesa más el que sea clase 
que el sea instancia de 'type'.


De la documentación: "Not all objects can be weakly referenced; those objects 
which can include class instances, functions written in Python (but not in 
C), and methods (both bound and unbound)." Sospecho que el weakref sólo 
comprueba que el objeto sea una instancia, sin comprobar el caso particular 
de que sea precisamente instancia de 'type'.

Mirando la nueva versión de python 2.4, se amplían el conjunto de objetos que 
pueden referenciarse débilmente: "The weakref module now supports a wider 
variety of objects including Python functions, class instances, sets, 
frozensets, deques, arrays, files, sockets, and regular expression pattern 
objects." Me faltaría probar este nuevo módulo a ver si lo han resuelto.

Me temo que aquí termina el experimento. No sé si se ha entendido del todo.
¿Qué opináis? ¿Habría que enviarlo como fallo a los desarrolladores del 
python?

Otra duda, ¿qué razones hay para que no se puedan crear referencias débiles a 
clases? Creo que en otros lenguajes como C++ sí que es posible

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.2 (GNU/Linux)

iD8DBQFA3CSfHLTQrABk8H0RAj9pAKD+0vK/udsQyyGXBhmxGkSLapCJrACg8eDV
aaG1upwEzOAGKS3d9ueWLqw=
=qtwl
-----END PGP SIGNATURE-----




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