[Python-ideas] PEP 428 - object-oriented filesystem paths

Antoine Pitrou solipsis at pitrou.net
Sun Oct 14 13:03:18 CEST 2012


On Sun, 14 Oct 2012 21:48:59 +1100
Steven D'Aprano <steve at pearwood.info> wrote:
> 
> Ah, I wondered if anyone else had picked up on that. When I read the PEP,
> I was concerned about the mental conflict between iteration and indexing
> of Path objects: given a Path p the sequence p[0] p[1] p[2] ... does
> something completely different from iterating over p directly.

p[0] p[1] etc. are just TypeErrors:

>>> p = Path('.')
>>> p[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 951, in __getitem__
    return self._make_child((key,))
  File "pathlib.py", line 1090, in _make_child
    return self._from_parts(parts)
  File "pathlib.py", line 719, in _from_parts
    drv, root, parts = self._parse_args(args)
  File "pathlib.py", line 711, in _parse_args
    % type(a))
TypeError: argument should be a path or str object, not <class 'int'>

So, yes, it's doing "something different", but there is little chance
of silent bugs :-)

> -1 on iteration over the children. Instead, use:
> 
> for child in p.walk():
>      ...
> 
> which has the huge benefit that the walk method can take arguments as
> needed, such as the args os.walk takes:
> 
> topdown=True, onerror=None, followlinks=False

Judging by its name and signature, walk() would be a recursive
operation, while iterating on a path isn't (it only gets you the
children).

> +1 on indexing giving path components, although the side effect of
> this is that you automatically get iteration via the sequence protocol.
> So be it -- I don't think we should be scared to *choose* an iteration
> model, just because there are other potential models.

There is already a .parts property which does exactly that:
http://www.python.org/dev/peps/pep-0428/#sequence-like-access

The problem with enabling sequence access *on the path object* is that
you get confusion with str's own sequencing behaviour, if you happen to
pass a str instead of a Path, or the reverse. Which is explained
briefly here:
http://www.python.org/dev/peps/pep-0428/#no-confusion-with-builtins

Regards

Antoine.


-- 
Software development and contracting: http://pro.pitrou.net





More information about the Python-ideas mailing list