[Python-checkins] GH-104898: Add __slots__ to os.PathLike (GH-104899)

barneygale webhook-mailer at python.org
Thu May 25 16:24:28 EDT 2023


https://github.com/python/cpython/commit/bd1b6228d132b8e9836fe352cd8dca2b6c1bd98c
commit: bd1b6228d132b8e9836fe352cd8dca2b6c1bd98c
branch: main
author: Barney Gale <barney.gale at gmail.com>
committer: barneygale <barney.gale at gmail.com>
date: 2023-05-25T21:24:20+01:00
summary:

GH-104898: Add __slots__ to os.PathLike (GH-104899)

files:
A Misc/NEWS.d/next/Library/2023-05-24-22-50-21.gh-issue-104898.UbT2S4.rst
M Lib/os.py
M Lib/pathlib.py
M Lib/test/test_os.py

diff --git a/Lib/os.py b/Lib/os.py
index 598c9e502301..31b957f13215 100644
--- a/Lib/os.py
+++ b/Lib/os.py
@@ -1079,6 +1079,8 @@ class PathLike(abc.ABC):
 
     """Abstract base class for implementing the file system path protocol."""
 
+    __slots__ = ()
+
     @abc.abstractmethod
     def __fspath__(self):
         """Return the file system path representation of the object."""
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index 3a7a1241ba77..fb78939dcc31 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -233,7 +233,7 @@ def __repr__(self):
         return "<{}.parents>".format(type(self._path).__name__)
 
 
-class PurePath(object):
+class PurePath(os.PathLike):
     """Base class for manipulating paths without I/O.
 
     PurePath represents a filesystem path and offers operations which
@@ -707,10 +707,6 @@ def match(self, path_pattern, *, case_sensitive=None):
                 return False
         return True
 
-# Can't subclass os.PathLike from PurePath and keep the constructor
-# optimizations in PurePath.__slots__.
-os.PathLike.register(PurePath)
-
 
 class PurePosixPath(PurePath):
     """PurePath subclass for non-Windows systems.
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index 584cc05ca82a..c6810c07ae09 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -4640,6 +4640,12 @@ class A(os.PathLike):
     def test_pathlike_class_getitem(self):
         self.assertIsInstance(os.PathLike[bytes], types.GenericAlias)
 
+    def test_pathlike_subclass_slots(self):
+        class A(os.PathLike):
+            __slots__ = ()
+            def __fspath__(self):
+                return ''
+        self.assertFalse(hasattr(A(), '__dict__'))
 
 class TimesTests(unittest.TestCase):
     def test_times(self):
diff --git a/Misc/NEWS.d/next/Library/2023-05-24-22-50-21.gh-issue-104898.UbT2S4.rst b/Misc/NEWS.d/next/Library/2023-05-24-22-50-21.gh-issue-104898.UbT2S4.rst
new file mode 100644
index 000000000000..e596ab36f5c7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-05-24-22-50-21.gh-issue-104898.UbT2S4.rst
@@ -0,0 +1 @@
+Add missing :attr:`~object.__slots__` to :class:`os.PathLike`.



More information about the Python-checkins mailing list