From 958b3e40581af8577c7213992d502786f87ec173 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Sat, 4 Jun 2016 12:49:35 -0700 Subject: issue27186: add PathLike ABC --- Lib/os.py | 17 ++++++++++++++++- Lib/test/test_os.py | 2 ++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Lib/os.py b/Lib/os.py index 0131ed8..e7d089e 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -22,7 +22,7 @@ and opendir), and leave all pathname manipulation to os.path """ #' - +import abc import sys, errno import stat as st @@ -1125,3 +1125,18 @@ if not _exists('fspath'): raise TypeError("expected str, bytes or os.PathLike object, not " + path_type.__name__) + +class PathLike(abc.ABC): + """ + Abstract base class for implementing the file system path protocol. + """ + @abc.abstractmethod + def __fspath__(self): + """ + Return the file system path representation of the object. + """ + raise NotImplementedError + + @classmethod + def __subclasshook__(cls, subclass): + return hasattr(subclass, '__fspath__') diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index bf06438..e740edf 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -3127,6 +3127,8 @@ class TestPEP519(unittest.TestCase): return '#feelthegil' self.assertEqual('#feelthegil', os.fspath(PathLike())) + self.assertTrue(issubclass(PathLike, os.PathLike)) + self.assertTrue(isinstance(PathLike(), os.PathLike)) def test_garbage_in_exception_out(self): vapor = type('blah', (), {}) -- cgit v0.12