7

I have learned that python does not guarantee that __del__ is called whenever an object is deleted. In other words, del x does not necessarily invoke its destructor x.__del__().

If I want to ensure proper object cleanup, I should use a context manager (in a with statement).

I know it's stupid, but for a couple of reasons (please don't ask why) I am tied to a system with Python 2.4; therefore context managers are out of question (they were introduced in Python 2.5)

So I need a an alternative solution, and hence my question: are there best practices that would help me to use __del__ reliably? I am thinking in the direction of "if python provides such functionality, there must be a way it can be efficiently used (I'm just to stupid to figure out how)",,,

Or I am just being naive, should forget about __del__ and move on to a completely different approach?

1
  • 3
    The problem is that Python does provide that functionality, but sadly not in a version that you have. Commented Apr 27, 2012 at 14:28

2 Answers 2

9

In short: No, there is no way to ensure it gets called.

The answer is to implement context managers yourself. A with statement roughly translates to:

x.__enter__() try: ... finally: x.__exit__() 

So just do it manually. It is a little more complex than that, so I recommend reading PEP 343 to fully understand how context managers work.

One option is to call your cleaning up function close(), and then in future versions of python, people can easily use contextlib.closing to turn it into a real context manager.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks @Lattyware, I will have a look at this PEP.
5

Instead of __del__, give your class a method called something like close, then call that explicitly:

foo = Foo() try: foo.do_interesting_stuff() finally: foo.close() 

For extra safety and forward-compatibility, have __exit__ and __del__ call close as well.

1 Comment

This is exactly what I wanted to avoid (call the destructor (or equivalent) explicitly). Unfortunately it may be the only way to go. Thanks!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.