summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/os.py17
-rw-r--r--Lib/test/test_os.py2
2 files changed, 18 insertions, 1 deletions
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', (), {})