[pyar] weakref.WeakValueDictionary

Claudio Freire klaussfreire en gmail.com
Jue Ene 10 15:47:22 ART 2013


2013/1/10 Andres Riancho <andres.riancho en gmail.com>:
>     Para solucionar esto se me ocurrio utilizar
> weakref.WeakValueDictionary; pero se ve que algo estoy haciendo mal,
> pero QUE? Les dejo una prueba de concepto que demuestra lo que quiero
> hacer y crashea :(

Lo que tiene que ser weak, es la referencia a poc, no al handler:

import weakref

class poc(object):
    def __init__(self):
        self.handlers =
weakref.WeakKeyDictionary({self:{'URL':self.handle_url}})

    def handle(self, method, obj):
        self.handlers[self][method](obj)

    def handle_url(self, obj):
        print obj

    def __del__(self):
        print 'deleted'


if __name__ == '__main__':
    dict_poc = poc()
    dict_poc.handle('URL', 1) # funciona, imprime 1

Fijate, que con el __del__, ese poc no es colectable (y genera un leak
de memoria). Es útil en este caso para corroborar que sin el __del__
sí se borraría (gc lo considera basura):

>>> p = poc()
>>> del p
>>>
>>> gc.collect()
19
>>> gc.garbage
[<__main__.poc object at 0x7f1661d54dd0>]

O sea que, **quitando el __del__**, me parece que obtenés el resultado
que querías.



More information about the pyar mailing list