On 07/08/2014 12:34 PM, Ben Hoyt wrote:
Better to just have the attributes be None if they were not fetched. None
is better than hasattr anyway, at least in the respect of not having to
catch exceptions to function properly.
The thing is, is_dir() and lstat() are not attributes (for a good
reason). Please read the relevant "Rejected ideas" sections and let us
know what you think. :-)
I did better than that -- I read the whole thing! ;)
-1 on the PEP's implementation.
Just like an attribute does not imply a system call, having a method named 'is_dir' /does/ imply a system call, and not
having one can be just as misleading.
If we have this:
size = 0
for entry in scandir('/some/path'):
size += entry.st_size
- on Windows, this should Just Work (if I have the names correct ;)
- on Posix, etc., this should fail noisily with either an AttributeError
('entry' has no 'st_size') or a TypeError (cannot add None)
and the solution is equally simple:
for entry in scandir('/some/path', stat=True):
- if not Windows, perform a stat call at the same time
Now, of course, we might get errors. I am not a big fan of wrapping everything in try/except, particularly when we
already have a model to follow -- os.walk:
for entry in scandir('/some/path', stat=True, onerror=record_and_skip):
If we don't care if an error crashes the script, leave off onerror.
If we don't need st_size and friends, leave off stat=True.
If we get better performance on Windows instead of Linux, that's okay.
scandir is going into os because it may not behave the same on every platform. Heck, even some non-os modules
(multiprocessing comes to mind) do not behave the same on every platform.
I think caching the attributes for DirEntry is fine, but let's do it as a snapshot of that moment in time, not name now,
and attributes in 30 minutes when we finally get to you because we had a lot of processing/files ahead of you (you being
a DirEntry ;) .
--
~Ethan~
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com