[Python-Dev] Updates to PEP 471, the os.scandir() proposal

Ben Hoyt benhoyt at gmail.com
Wed Jul 9 17:35:26 CEST 2014


>> One issue with option #2 that I just realized -- does scandir yield the
>> entry at all if there's a stat error? It
>> can't really, because the caller will expect the .lstat attribute to be
>> set (assuming he asked for type='lstat') but
>>
>> it won't be. Is effectively removing these entries just because the stat
>> failed a problem? I kind of think it is. If
>> so, is there a way to solve it with option #2?
>
>
> Leave it up to the onerror handler.  If it returns None, skip yielding the
> entry, otherwise yield whatever it returned
> -- which also means the error handler should be able to set fields on the
> DirEntry:
>
>   def log_err(exc, entry):
>       logger.warn("Cannot stat {}".format(exc.filename))
>       entry.lstat.st_size = 0
>       return True

This is an interesting idea, but it's just getting more and more
complex, and I'm guessing that being able to change the attributes of
DirEntry will make the C implementation more complex.

Also, I'm not sure it's very workable. For log_err above, you'd
actually have to do something like this, right?

def log_err(exc, entry):
    logger.warn("Cannot stat {}".format(exc.filename))
    entry.lstat = os.stat_result((0, 0, 0, 0, 0, 0, 0, 0, 0, 0))
    return entry

Unless there's another simple way around this issue, I'm back to
loving the simplicity of option #1, which avoids this whole question.

-Ben


More information about the Python-Dev mailing list