Searching equivalent to C++ RAII or deterministic destructors

Dave Angel davea at ieee.org
Thu Jul 2 08:05:12 EDT 2009


Ulrich Eckhardt wrote:
> Hi!
>
> I'm currently converting my bioware to handle Python code and I have
> stumbled across a problem...
>
> Simple scenario: I have a handle to a resource. This handle allows me to
> manipulate the resource in various ways and it also represents ownership.
> Now, when I put this into a class, instances to that class can be shared,
> using Python's reference counting. What I'm missing is a way to
> automatically release the resource, something which I would do in the
> destructor in C++.
>
> Any ideas how to solve this?
>
> Uli
>
>   
As someone else pointed out, 'with' is the first line of defense.  It 
makes the stuff you could already do with try/except/finally much easier 
to get right.

Look also at 'del' a command in the language which explicitly deletes an 
object.

But I'm guessing you want something that automatically deletes objects 
whenever the last reference disappears.  That's an implementation 
detail, not a language guarantee.  In particular CPython does what you 
want, by using reference counting.  That's the only Python I've used, so 
it's only hearsay when I say that other implementations, (maybe Cython 
or Jython) do not all work the same way.

In CPython, any object whose *last* reference goes away, will get 
immediately deleted.  So if you avoid circular references, it should do 
just what you want.  Orphaned circular references are caught by the 
garbage collector, which runs periodically, but is non-deterministic.

Two more caveats.  Exceptions tend to hang onto stuff in their near 
vicinity, and I can't tell you the algorithm for what happens.  But an 
explicit del in the except clause can probably handle that.

Finally, closures can hang onto stuff.  So if you have nested functions, 
or lambda functions, it's possible they're going to keep things longer 
than you realize.






More information about the Python-list mailing list