[Tutor] What's the best way to ask forgiveness here?

davidheiserca at gmail.com davidheiserca at gmail.com
Mon Sep 13 21:21:22 CEST 2010


I suggest something like:

try:
    os.makedirs(path)
except:
    pass
open("%s/%s" % (path, filename), 'w').write(filedata)


----- Original Message ----- 
From: "Emile van Sebille" <emile at fenx.com>
To: <tutor at python.org>
Sent: Monday, September 13, 2010 11:56 AM
Subject: Re: [Tutor] What's the best way to ask forgiveness here?


> On 9/13/2010 11:31 AM Brian Jones said...
>> I've been coding Python long enough that 'asking forgiveness instead of
>> permission' is my first instinct, but the resulting code is sometimes
>> clumsy, and I wonder if someone can suggest something I'm missing, or at
>> least validate what's going on here in some way.
>>
>> What I'm trying to do is write a file to a directory. However, the 
>> directory
>> may not exist the first time I try to write a file there, so I'm going to
>> first try to write the file, and if I get an exception, create the 
>> directory
>> (er, *try* to), and *then* write the file there. Here's my first shot at 
>> the
>> code:
>>
>>          try:
>>              self.save_file(picfile_fullpath, picdata)
>>          except IOError as err:
>>              # directory doesn't exist. Try to create it.
>>              try:
>>                  os.makedirs(picfile_fullpath)
>>              except OSError as oserr:
>>                  logging.error("Can't create file path: %s (%s)" %
>> (picfile_fullpath, oserr))
>>              else:
>>                  # Created dir, now write file.
>>                  try:
>>                      self.save_file(picfile_fullpath, picdata)
>>                  except IOError as err:
>>                      logging.error("Bailing. Couldn't save file %s (%s)" 
>> %
>> (picfile_fullpath, err))
>>                      return False
>
> Unless this is in a tight loop, I think I'd write:
>
> try:
>     os.makedirs(picfile_fullpath)
>     try:
>         self.save_file(picfile_fullpath, picdata)
>         return True
>         # all/only error handling code follows.
>     except IOError as err:
>         logging.error("Bailing. Couldn't save file %s (%s)" % 
> (picfile_fullpath, err))
>         return False
> except OSError as oserr:
>     logging.error("Can't create file path: %s (%s)" % (picfile_fullpath, 
> oserr))
>     return False
>
> which eliminates the duplicated save_file step.
>
>>
>> Doesn't this seem less readable than the 'ask permission' equivalent? I
>> think it does, but in this case asking permission for every single 
>> operation
>> when the dir will only need to be created a single time (and then may be
>> written to several hundred times) is pretty wasteful.
>
> Agreed -- if it's in a loop, you'd want to only check once.  Of course, if 
> the directory is eg an nfs share, continued access could be an issue.
>
> HTH,
>
> Emile
>
>
>>
>> I suppose I could set some sentinel variable and check for it in a while
>> loop, but then I need some other scaffolding code to make sure I don't
>> infinitely loop trying to create the directory, and probably some other
>> stuff I'm forgetting, so it strikes me as being just as messy.
>>
>> Is there a clean sort of pattern to apply in instances like this?
>>
>> Thanks.
>> brian
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> Tutor maillist  -  Tutor at python.org
>> To unsubscribe or change subscription options:
>> http://mail.python.org/mailman/listinfo/tutor
>
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> To unsubscribe or change subscription options:
> http://mail.python.org/mailman/listinfo/tutor 



More information about the Tutor mailing list