diff --git a/Lib/os.py b/Lib/os.py index 0131ed8195e..e7d089ed35b 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 bf06438db22..e740edf644e 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', (), {})