469,328 Members | 1,282 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,328 developers. It's quick & easy.

Is RAII possible in Python?

As much as I love Python, I sometimes find myself wishing Python
supported the RAII idiom (resource acquisition is initialization) that
is available in C++, the emerging D language, and others.

In some situations (like controlling non-memory resources) it is nice to
be able to create an object that will execute some code on its
destruction. For example, an object that controls access to a critical
section: the creation of the object calls the function required to enter
the critical section, and the __del__() calls the function required to
exit the critical section. If an exception occurs while the code is
insinde the critical section managed by the object, the the object's
__del__() is automatically called and the critical section exited.

AFAIK, the call of __del__() method on object destruction is not
garanteed to be called when the interpreter exists. Is this true?

Is the __del__() mehod of an object garanteed to be called when a
function exists normally or is forced to exit by an exception?

Is RAII available in Python?

Thanks

Pierre

Jul 18 '05 #1
4 4344
Pierre Rouleau wrote:
Is RAII available in Python?


In practice, yes. Objects are destroyed when their reference count goes to
zero.

In theory, no. The language specification does not guarantee this behavior.
--
Rainer Deyke - ra*****@eldwood.com - http://eldwood.com
Jul 18 '05 #2
Pierre Rouleau <pr******@impathnetworks.com> writes:
AFAIK, the call of __del__() method on object destruction is not
garanteed to be called when the interpreter exists. Is this true?
I think it is supposed to be called.
Is the __del__() mehod of an object garanteed to be called when a
function exists normally or is forced to exit by an exception?
No.
Is RAII available in Python?


You can use the try/finally construction to make sure the object gets
destroyed when the finally clause runs.
Jul 18 '05 #3
You need to use the try/finally statement or see PEP 310.
http://www.python.org/peps/pep-0310.html
Jul 18 '05 #4


Pierre Rouleau wrote:
As much as I love Python, I sometimes find myself wishing Python
supported the RAII idiom (resource acquisition is initialization) that
is available in C++, the emerging D language, and others.

In some situations (like controlling non-memory resources) it is nice to
be able to create an object that will execute some code on its
destruction. For example, an object that controls access to a critical
section: the creation of the object calls the function required to enter
the critical section, and the __del__() calls the function required to
exit the critical section. If an exception occurs while the code is
insinde the critical section managed by the object, the the object's
__del__() is automatically called and the critical section exited.

AFAIK, the call of __del__() method on object destruction is not
garanteed to be called when the interpreter exists. Is this true?

Is the __del__() mehod of an object garanteed to be called when a
function exists normally or is forced to exit by an exception?

Is RAII available in Python?


Thanks to all that posted a reply.

To summarize those replies, in Python 2.3 the 'calling' code is
responsible to provide protection with the try/finally clause, as in
(atken from pep 310):

the_lock.acquire()
try:
....
finally:
the_lock.release()

PEP-310 (http://www.python.org/peps/pep-0310.html) proposes a more
condensed syntax using a new keyword (with).

I have seen some PEP310 discussion on comp.python.devel and I hope
PEP310 will be implemented in the next version of Python (2.4) as
written on the PEP-310 page. Where can we find out about the state of a
PEP and whether it's going to get implemented?
Thanks!

Pierre

Jul 18 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.

By using this site, you agree to our Privacy Policy and Terms of Use.