[Tutor] What's the best way to ask forgiveness here?
Adam Bark
adam.jtm30 at gmail.com
Mon Sep 13 22:05:43 CEST 2010
On 13/09/10 20:12, Brian Jones wrote:
> Thanks for the replies so far. One thing that's probably relevant:
> once a directory is created, I can expect to write a couple of hundred
> files to it, so doing a 'try os.makedirs' right off the bat strikes me
> as coding for the *least* common case instead of the *most* common
> (which is that the directory exists and the file write succeeds). If
> this were a one-off file write.... well then things get easier, but
> I'd like to avoid attempting a makedirs 100 times when 99 of those
> times I know it'll give me an error.
>
> brian
>
> On Mon, Sep 13, 2010 at 3:07 PM, Evert Rol <evert.rol at gmail.com
> <mailto:evert.rol at gmail.com>> 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.
>
> That would work.
> Though I would just try to create the error directory first. If
> that fails, I check the error message/code in the except clause:
> if it indicates the directory already exists, I pass the
> exception, otherwise reraise it.
> Then I continue with creating the file within the directory I now
> am certain of exists.
> Note 1: certain is only half: some other process could remove the
> directory in the split second between my code creating it and my
> code creating the file. If you think that could happen, you'll
> need to look at the other ways to do this.
> Note 2: the directory can exist, but not have write access to your
> process. So between the try-except for creating a directory and
> the try-except for creating a file, you may put in a try-except
> for chmod. Of course, if you're not the owner, both the chmod and
> file creation will fail (I'm assuming some *nix platform here, btw).
>
> > 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.
>
> Careful: you're not checking the actually error given by the
> exception. There may be more than one reason that the file can't
> be created (examples: the permissions mentioned above, or some
> file creation limit in a directory).
>
>
> > 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.
>
> One of the things I once read (but I forgot where) on this issue,
> is the usual "it depends". It depends whether you except that
> often, the directory doesn't exist and the file can't directly be
> created. In that case, if may be quicker to ask permission first
> (simple if-statement). If you expect that in general, you can
> immediately create the file within the directory (so an exception
> is unlikely to occur), then use a try-except clause.
> But don't take my word for it; I'd be curious what others on this
> list say about this.
>
>
> >
> > 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?
>
> I guess not, though readability of code is an important thing to
> consider. In this case, I don't find the correctly unreadable, but
> at some point, these things do tend to get out of hand and you're
> better off coding it differently (perhaps even using functions).
>
>
> Evert
>
Well surely then you just check the directory first with a try:
os.makedirs. Then your try: self.savefile for each file.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20100913/b0dd2f4d/attachment-0001.html>
More information about the Tutor
mailing list