pythonic way to free resources

Chirayu thephoenix235 at gmx.net
Wed Aug 14 14:47:59 EDT 2002


Hi,

It seems I cant use try/except/finally. Its either try/finally or 
try/except or nesting to get the desired effect. But even if it were 
possible, its tough to write good stuff in the finally clause - if u're 
dealing with more than 1 resource.

try:
    f1 = file (.......)
    f2 = file (.......)
    # some other processing - may throw
    f3 = file (.......)
    # more processing - may throw
finally:
    # which ones of f1, f2, f3 do i close?

I'm using files as a placeholder for a resource in general.  Any of the 
above lines may throw. Sorry, any of the above lines may raise an exception.

I'm currently using
f1,f2,f3 = None
and then checking for None in the finally block. Not a nice solution.

also,

f=file ('c:/config.sys','r')
print dir(f)

does not list a '__del__'. So i assume that even if the ref count goes to 
0, the file wont be closed. (Assuming CPython of course.)

ps: Studly caps a typo :D

ciao,
Chirayu.

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

>     Chirayu> I'm from the C++ world. I'm used to writing code like this.
>
>     Chirayu> // some block of code - could be try/catch, func body, loop 
> body, etc
>     Chirayu> {
>     Chirayu>      ifstream inp (inFIle, ios::read | ios::binary)
>     Chirayu>      ofstream out (outFIle, ios::write | ios::binary)
>     Chirayu>      ......
>     Chirayu>      use inp and out
>     Chirayu>      .......
>     Chirayu> }
>     ...
>     Chirayu> What is the python idiom to do something like this?
>
>In Python, you'd use try/finally.  Something like
>
>     dbconn = self.db_pool.get()
>     try:
>         c = dbconn.cursor()
>         c.execute("select ...")
>         for row in c.fetchall():
>             pass
>     finally:
>         self.db_pool.put(dbconn)
>
>In the case of local file objects you don't need to use try/finally however.
>When a name goes out of scope the reference count of the object who which it
>refers is decremented, and if it reaches zero the object is reclaimed.  That
>would hold true in this case if inFIle was opened successfully but outFIle
>was not.  (Interesting studly caps by the way... ;-)
>
>--
>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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20020815/c8d4e76b/attachment.html>


More information about the Python-list mailing list