conditionally close file on exit from function
<p>I have a (recursive) function which I would like to accept either a string or an opened file object.  If the argument is a string, then the function opens a file and uses that file object.  It seems best to close this opened file object explicitly when I return from the function, but only if a string was passed in.  (Imagine the surprise from the user when they pass in an opened file object and find that their file object was closed somewhere).  Here's what I'm currently using:</p>

<pre><code>def read_file(f, param):
    do_close = isinstance(f,basestring)
    f = open(f, 'rb') if do_close else f
    try:
        info = f.read(4)
        #check info here
        if info == Info_I_Want(param):
           return f.read(get_data(info))
        else:
           f.seek(goto_new_position(info))
           return read_file(f,param)
    except IKnowThisError:
           return None
    finally:
        if do_close:
           f.close()
</code></pre>

<p>You can assume that <code>IKnowThisError</code> will be raised at some point if I don't find the info I want.</p>

<p>This feels very kludgy.  Is there a better way?    </p>
