Igor Sobreira

Python weakref

Existe um módulo bem interessante na biblioteca padrão do Python que eu não conhecia até pouco tempo atrás, o weakref. Ele serve pra manter uma "referência fraca" para um objeto. Mas o que seria isso? Uma weak reference não é suficiente para manter o objeto na memória, então se só existir esse tipo de referência para o objeto, o coletor de lixo vai destruí-lo.

Isso é interessante pra evitar um alto consumo de memória com objetos muito grandes que não deveriam mais estar vivos. Um problema que pode acontecer usando o padrão de projeto Observer (mal implementado), por exemplo .

Um exemplo

>>> class Foo(object):
...   def say_hello(self): print 'say hello'
...
>>> a = Foo()
>>> a.say_hello()
say hello
>>> r = weakref.ref(a)

r é uma referência fraca para o objeto a

>>> r() is a
True
>>> r().say_hello()
say hello
>>> del a
>>> from gc import collect
>>> collect()  # forçando a coleta de lixo
0
>>> print r()
None

Já existem classes úteis que usam weak references: WeakKeyDictionary e WeakValueDictionary. Vale a pena dar uma olhada na documentação:

http://docs.python.org/library/weakref.html

blog comments powered by Disqus

My name is Igor Sobreira and is my website. I'm a software developer working at Real Geeks. I currently live in Hawaii doing the two things that I like most: windsurfing and writing software.

See more about me and get in touch.