Q on explicitly calling file.close
Charles Yeomans
charles at declareSub.com
Wed Sep 9 17:19:29 EDT 2009
On Sep 9, 2009, at 4:50 PM, r wrote:
> On Sep 9, 3:18 pm, David C Ullrich <dullr... at sprynet.com> wrote:
> (snip)
>> These days I've actually got the syntax and spelling memorized -
>> I can type "close()" without needing to look it up!
>
> +1
>
> You are so right David! I think some people around here need to look
> up "code reuse". Here are a couple of simple templates for our friends
> to study...
>
> def read_file(fname, mode='rb'):
> '''open file and return contents'''
> try:
> f = open(fname, mode)
> s = f.read()
> return s
> except:
> return 0
> finally:
> f.close()
>
> def write_file(fname, s, mode='wb'):
> '''open file, truncate, and write string'''
> try:
> f = open(fname, mode)
> f.write(s)
> return 1
> except:
> return 0
> finally:
> f.close()
Unfortunately, both of these simple templates have the following
problem -- if open fails, a NameError will be raised from the finally
block.
def read_file(fname, mode='rb'):
'''open file and return contents'''
f = open(fname, mode)
try:
return f.read()
finally:
f = f.close()
I removed the except block because I prefer exceptions to error codes.
def write_file(fname, s, mode='wb'):
'''open file, truncate, and write string'''
f = open(fname, mode)
try:
f.write(s)
finally:
f = f.close()
In addition to fixing the latent bug in the second simple template, I
took the opportunity to correct your heinous violation of command-
query separation.
Charles Yeomans
More information about the Python-list
mailing list