[Python-ideas] tweaking the file system path protocol

Koos Zevenhoven k7hoven at gmail.com
Fri May 26 09:20:39 EDT 2017


Accidentally sent the email before it was done. Additions / corrections below:

On Fri, May 26, 2017 at 3:58 PM, Koos Zevenhoven <k7hoven at gmail.com> wrote:
> On Wed, May 24, 2017 at 5:52 PM, Wolfgang Maier
>>
>> - makes the "path.__fspath__() if hasattr(path, "__fspath__") else path"
>> idiom consistent for subclasses of str and bytes that define __fspath__
>>
>
> One can discuss whether this is the best idiom to use (I did not write
> it, so maybe someone else has comments).
>
> Anyway, some may want to use
>
> path.__fspath__() if hasattr(path, "__fspath__") else str(path)
>
> and some may want
>
> path if isinstance(path, (str, bytes)) else path.__fspath__()
>
> Or others may not be after oneliners like this and instead include the
> full implementation of fspath in their code—or even better, with some
> modifications.
>
> Really, the best thing to use in pre-3.6 might be more like:
>
> def fspath(path):
>     if isinstance(path, (str, bytes)):
>         return path
>     if hasattr(path, '__fspath__'):
>         return path.__fspath__()
>     if type(path).__name__ == 'DirEntry':
>         return path.path
>     if isinstance(path, pathlib.PurePath):
>         return str(path)
>     raise TypeError("Argument cannot be interpreted as a file system path: " + repr(path))
>

In the above, I have to check type(path).__name__, because DirEntry
was not exposed as os.DirEntry in 3.5 yet.

For pre-3.4 Python and for older third-party libraries that do inherit
from str/bytes, one could even use something like:

def fspath(path):
    if isinstance(path, (str, bytes)):
        return path
    if hasattr(type(path), '__fspath__'):
        return type(path).__fspath__(path)
    if type(path).__name__ == 'DirEntry':
        return path.path
    if "Path" in type(path).__name__: # add whatever known names for
path classes (what a hack!)
        return str(path)
    raise TypeError("Argument cannot be interpreted as a file system
path: " + repr(path))


—Koos


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


More information about the Python-ideas mailing list