我有一个(递归)函数,我想接受一个字符串或一个打开的文件对象。如果参数是字符串,则函数打开一个文件并使用该文件对象。当我从函数返回时,最好显式关闭这个打开的文件对象,但前提是传入了一个字符串。(想象一下当用户传入一个打开的文件对象并发现他们的文件对象在某个地方关闭时会感到惊讶)。这是我目前正在使用的:
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()
IKnowThisError
如果我找不到我想要的信息,您可以假设会在某个时候提出。
这感觉非常笨拙。有没有更好的办法?