https://github.com/python/cpython/commit/2bd4ff07001038fada17b6dbcb5ab5aabd27c26e
commit: 2bd4ff07001038fada17b6dbcb5ab5aabd27c26e
branch: main
author: Barney Gale <barney.g...@gmail.com>
committer: barneygale <barney.g...@gmail.com>
date: 2025-07-27T12:47:15+01:00
summary:

GH-128520: pathlib ABCs: tweak protocol for virtual path strings (#134104)

Adjust `pathlib._os.vfspath()` so that it doesn't try `os.fsdecode()`. I
don't know that supporting `os.PathLike` arguments is a good idea, so
it's best to leave it out for now.

files:
M Lib/pathlib/__init__.py
M Lib/pathlib/_os.py
M Lib/test/test_pathlib/support/zip_path.py

diff --git a/Lib/pathlib/__init__.py b/Lib/pathlib/__init__.py
index fd073445e89b62..cea1a9fe57eedf 100644
--- a/Lib/pathlib/__init__.py
+++ b/Lib/pathlib/__init__.py
@@ -188,9 +188,6 @@ def __reduce__(self):
     def __repr__(self):
         return "{}({!r})".format(self.__class__.__name__, self.as_posix())
 
-    def __fspath__(self):
-        return str(self)
-
     def __bytes__(self):
         """Return the bytes representation of the path.  This is only
         recommended to use under Unix."""
@@ -259,6 +256,9 @@ def __str__(self):
                                                   self._tail) or '.'
             return self._str
 
+    __fspath__ = __str__
+    __vfspath__ = __str__
+
     @classmethod
     def _format_parsed_parts(cls, drv, root, tail):
         if drv or root:
diff --git a/Lib/pathlib/_os.py b/Lib/pathlib/_os.py
index 62a4adb555ea89..fbcbfb979d1278 100644
--- a/Lib/pathlib/_os.py
+++ b/Lib/pathlib/_os.py
@@ -210,24 +210,18 @@ def magic_open(path, mode='r', buffering=-1, 
encoding=None, errors=None,
     raise TypeError(f"{cls.__name__} can't be opened with mode {mode!r}")
 
 
-def vfspath(path):
+def vfspath(obj):
     """
     Return the string representation of a virtual path object.
     """
+    cls = type(obj)
     try:
-        return os.fsdecode(path)
-    except TypeError:
-        pass
-
-    path_type = type(path)
-    try:
-        return path_type.__vfspath__(path)
+        vfspath_method = cls.__vfspath__
     except AttributeError:
-        if hasattr(path_type, '__vfspath__'):
-            raise
-
-    raise TypeError("expected str, bytes, os.PathLike or JoinablePath "
-                    "object, not " + path_type.__name__)
+        cls_name = cls.__name__
+        raise TypeError(f"expected JoinablePath object, not {cls_name}") from 
None
+    else:
+        return vfspath_method(obj)
 
 
 def ensure_distinct_paths(source, target):
diff --git a/Lib/test/test_pathlib/support/zip_path.py 
b/Lib/test/test_pathlib/support/zip_path.py
index 21e1d07423aff5..2bfe89b36595b0 100644
--- a/Lib/test/test_pathlib/support/zip_path.py
+++ b/Lib/test/test_pathlib/support/zip_path.py
@@ -334,4 +334,4 @@ def symlink_to(self, target, target_is_directory=False):
         zinfo.external_attr = stat.S_IFLNK << 16
         if target_is_directory:
             zinfo.external_attr |= 0x10
-        self.zip_file.writestr(zinfo, vfspath(target))
+        self.zip_file.writestr(zinfo, target)

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: arch...@mail-archive.com

Reply via email to