pythonic way to free resources

Chirayu thephoenix235 at gmx.net
Wed Aug 14 15:11:52 EDT 2002


The NullObject class is just great. Nesting try blocks is....yes....a 
little messy....but works well enough. Thanks for the help. I'll follow 
this technique.

I did'nt know about automatic cleanup (for file objects) without calling 
__del__. It helps quite a bit.


At 02:01 PM 8/14/02 -0500, Skip Montanaro wrote:

>     Chirayu> It seems I cant use try/except/finally. Its either try/finally
>     Chirayu> or try/except or nesting to get the desired effect.
>
>Yup.
>
>     Chirayu> But even if it were possible, its tough to write good stuff in
>     Chirayu> the finally clause - if u're dealing with more than 1 resource.
>
>Just nest the try/finally statements or initialize the variables to None
>before the block.
>
>     Chirayu> try:
>     Chirayu>     f1 = file (.......)
>     Chirayu>     f2 = file (.......)
>     Chirayu>     # some other processing - may throw
>     Chirayu>     f3 = file (.......)
>     Chirayu>     # more processing - may throw
>     Chirayu> finally:
>     Chirayu>     # which ones of f1, f2, f3 do i close?
>
>     Chirayu> I'm using files as a placeholder for a resource in general.
>     Chirayu> Any of the above lines may throw. Sorry, any of the above lines
>     Chirayu> may raise an exception.
>
>Also, note that you should initialize the object before the try:
>
>     f1 = file(...)
>     try:
>         # do stuff with f1
>         f2 = file(...)
>         try:
>             # do stuff with f2
>         finally:
>             f2.close()
>     finally:
>         f1.close()
>
>Sort of messy, but effective.
>
>     Chirayu> I'm currently using
>     Chirayu> f1,f2,f3 = None
>     Chirayu> and then checking for None in the finally block. Not a nice
>     Chirayu> solution.
>
>How about
>
>     class NullObject:
>         def close(self):
>             pass
>
>     f1 = f2 = f3 = NullObject()
>     try:
>         f1 = file(...)
>         f2 = file(...)
>         f3 = file(...)
>         ...
>     finally:
>         f1.close()
>         f2.close()
>         f3.close()
>
>     Chirayu> does not list a '__del__'. So i assume that even if the ref
>     Chirayu> count goes to 0, the file wont be closed. (Assuming CPython of
>     Chirayu> course.)
>
>You assume wrong. ;-)  __del__ is a user-defined method.  File objects are
>closed automatically when their ref counts reach zero.
>
>--
>Skip Montanaro
>skip at pobox.com
>consulting: http://manatee.mojam.com/~skip/resume.html

Only those who will risk going too far
can possibly find out how far one can go.
- T.S. Eliot






More information about the Python-list mailing list