On 13/09/10 19:31, Brian Jones wrote:
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

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.

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

How about something like this?

try:
    os.makedirs(picfile_fullpath)
    self.save_file(picfile_fullpath, picdata)
except IOError, OSError as err:
    if type(err) is OSError:
logging.error("Can't create file path: %s (%s)" % (picfile_fullpath, oserr))
        try:
            self.save_file(picfile_fullpath, picdata)
        except IOError:
logging.error("Bailing. Couldn't save file %s (%s)" % (picfile_fullpath, err))
    else:
logging.error("Bailing. Couldn't save file %s (%s)" % (picfile_fullpath, err))

This saves you one try except and the else although it adds an if else. Either way it's not as far nested.
I just thought up another way that just takes two try excepts:

try:
    try:
        os.makedirs(picfile_fullpath)
        self.save_file(picfile_fullpath, picdata)
    except OSError as oserr:
logging.error("Can't create file path: %s (%s)" % (picfile_fullpath, oserr))
        self.save_file(picfile_fullpath, picdata)
except IOError as err:
logging.error("Bailing. Couldn't save file %s (%s)" % (picfile_fullpath, err))
    return False

HTH
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to