[Python-ideas] tweaking the file system path protocol

Koos Zevenhoven k7hoven at gmail.com
Tue May 23 12:17:49 EDT 2017

On Tue, May 23, 2017 at 1:12 PM, Wolfgang Maier
<wolfgang.maier at biologie.uni-freiburg.de> wrote:
> What do you think of this idea for a slight modification to os.fspath:
> the current version checks whether its arg is an instance of str, bytes or
> any subclass and, if so, returns the arg unchanged. In all other cases it
> tries to call the type's __fspath__ method to see if it can get str, bytes,
> or a subclass thereof this way.
> My proposal is to change this to:
> 1) check whether the type of the argument is str or bytes *exactly*; if so,
> return the argument unchanged
> 2) check wether __fspath__ can be called on the type and returns an instance
> of str, bytes, or any subclass (just like in the current version)
> 3) check whether the type is a subclass of str or bytes and, if so, return
> it unchanged

The reason why this was not done was that a str or bytes subclass that
implements __fspath__(self) would work in both pre-3.6 and 3.6+ but
behave differently. This would be also be incompatible with existing
code using str(path) for compatibility with the stdlib (the old way,
which people still use for pre-3.6 compatibility even in new code).

> This would have the following implications:
> a) it would speed up the very common case when the arg is either a str or a
> bytes instance exactly

To get the same performance benefit for str and bytes, but without
changing functionality, there could first be the exact type check and
then the isinstance check. This would add some performance penalty for
PathLike objects. Removing the isinstance part of the __fspath__()
return value, which I find less useful, would compensate for that. (3)
would not be necessary in this version.

Are you asking for other reasons, or because you actually have a use
case where this matters? If this performance really matters somewhere,
the version I describe above could be considered. It would have 100%
backwards compatibility, or a little less (99% ?) if the isinstance
check of the __fspath__() return value is removed for performance

> b) user-defined classes that inherit from str or bytes could control their
> path representation just like any other class

Again, this would cause differences in behavior between different
Python versions, and based on whether str(path) is used or not.


+ Koos Zevenhoven + http://twitter.com/k7hoven +

More information about the Python-ideas mailing list