[Python-ideas] tweaking the file system path protocol

Koos Zevenhoven k7hoven at gmail.com
Fri May 26 07:15:44 EDT 2017


On Wed, May 24, 2017 at 3:41 AM, Steven D'Aprano <steve at pearwood.info> wrote:
> On Wed, May 24, 2017 at 12:18:16AM +0300, Serhiy Storchaka wrote:
>> I don't know a reasonable use case for this feature. The __fspath__
>> method of str or bytes subclasses returning something not equivalent to
>> self looks confusing to me.
>
> I can imagine at least two:
>
> - emulating something like DOS 8.3 versus long file names;
> - case normalisation
>

These are not reasonable use cases because they should not subclass
str or bytes. That would be confusing.

> but what would make this really useful is for debugging. For instance, I
> have used something like this to debug problems with int() being called
> wrongly:
>
> py> class MyInt(int):
> ...     def __int__(self):
> ...             print("__int__ called")
> ...             return super().__int__()
> ...
> py> x = MyInt(23)
> py> int(x)
> __int__ called
> 23
>

You can monkeypatch the stdlib:

from os import fspath as real_fspath
mystr = "23"

def fspath(path):
    if path is mystr:
        print("fspath was called on mystr")
    return real_fspath(path)

os.fspath = fspath

try_something_with(mystr)

Having __fspath__ on str and bytes by default would destroy the
ability to distinguish between PathLike and non-PathLike, because all
strings would appear to be PathLike. (Not to mention the important
compatibility issues between different Python versions and different
ways of dealing with pre-PEP519 path objects.)

—Koos


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


More information about the Python-ideas mailing list