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

Antoine Pitrou solipsis at pitrou.net
Sat Oct 6 14:06:52 CEST 2012

On Sat, 06 Oct 2012 17:39:13 +0900
"Stephen J. Turnbull"
<turnbull at sk.tsukuba.ac.jp> wrote:
>
> I wonder if there is a need to distinguish between a path naming a
> directory as a collection, and as a file itself?  Or can/should this
> be implicit (wash my mouth out with soap!) in the operation using the
> Path?

I don't think there's a need to distinguish. Trying to
access /etc/passwd/somefile will simply raise an error on I/O.

>  > since we need to be able to combine paths and regular strings, for
>  > ease of use.
>
> Is it really that obnoxious to write "p + Path('bar')" (where p is a
> Path)?
>
> What about the case "'bar' + p"?  Since Python isn't C, you can't
> express that as "'bar'[p]"!

The issue I envision is if you write p + "bar", thinking p is a Path,
and p is actually a str object. It won't raise, but give you the wrong
result.

>  > Both '/' and '\\' are accepted as path separators under Windows. Under
>  > Unix, '\\' is a regular character:
>
> That's outright ugly, especially from the "collections" point of view
> (foo/bar/xyzzy is not a member of foo).  If you want something that
> doesn't suffer from the bogosities of os.path, this kind of platform-
> dependence should be avoided, I think.

Well, you do want to be able to convert str paths to Path objects
without handling path separator conversion by hand. It's a matter of
practicality.

>  > > Also, there is no good terminology in current use here. The only
>  > > concrete thing I can suggest is that "root" would be better used as
>  > > the term for what you're calling "anchor" as Windows users would
>  > > expect the root of "C:\foo\bar\baz" to be "C:\".
>  >
>  > But then the root of "C:foo" would be "C:", which sounds wrong:
>  > "C:" isn't a root at all.
>
> Why not interpret the root of "C:foo" to be None?  The Windows user
> can still get "C:" as the drive, and I don't think that will be
> surprising to them.

That's a possibility indeed. I'd like to have feedback from more

>>> PureNTPath('c:foo').root
''
>>> PureNTPath('c:\\foo').root
'c:\\'

which would also give the following for UNC paths:

>>> PureNTPath('//network/share/foo/bar').root
'\\\\network\\share\\'

> I wonder if "mount_point" is sufficiently general to include the roots
> of real local file systems, remote file systems, Windows drives, and
> pseudo file systems?  An obvious problem is that Windows users would
> not find that terminology natural.

Another is that finding mount points is I/O, while finding the root is
a purely lexical operation.

Regards

Antoine.

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