]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
pathlib ABCs: support initializing paths with no arguments (#126608)
authorBarney Gale <barney.gale@gmail.com>
Sat, 9 Nov 2024 18:21:53 +0000 (18:21 +0000)
committerGitHub <noreply@github.com>
Sat, 9 Nov 2024 18:21:53 +0000 (18:21 +0000)
In the past I've equivocated about whether to require at least one argument
in the `PurePathBase` (and `PathBase`) initializer, and what the default
should be if we make it optional. I now have a local use case that has
persuaded me to make it optional and default to the empty string (a
`zipp.Path`-like class that treats relative and absolute paths similarly.)
Happily this brings the base class more in line with `PurePath` and `Path`.

Lib/pathlib/_abc.py
Lib/test/test_pathlib/test_pathlib_abc.py

index 43e6624934b045b61846f50e7cebce252076c104..e9e46e511bddf13d683fb4c876ed35bdccbe3932 100644 (file)
@@ -124,14 +124,12 @@ class PurePathBase:
     parser = ParserBase()
     _globber = PathGlobber
 
-    def __init__(self, arg, *args):
-        paths = [arg]
-        paths.extend(args)
-        for path in paths:
-            if not isinstance(path, str):
+    def __init__(self, *args):
+        for arg in args:
+            if not isinstance(arg, str):
                 raise TypeError(
-                    f"path should be a str, not {type(path).__name__!r}")
-        self._raw_paths = paths
+                    f"argument should be a str, not {type(arg).__name__!r}")
+        self._raw_paths = list(args)
         self._resolving = False
 
     def with_segments(self, *pathsegments):
@@ -270,7 +268,7 @@ class PurePathBase:
                 raise ValueError(f"'..' segment in {str(other)!r} cannot be walked")
             else:
                 parts0.append('..')
-        return self.with_segments('', *reversed(parts0))
+        return self.with_segments(*reversed(parts0))
 
     def is_relative_to(self, other):
         """Return True if the path is relative to another path or False.
@@ -746,7 +744,7 @@ class PathBase(PurePathBase):
         # enable users to replace the implementation of 'absolute()' in a
         # subclass and benefit from the new behaviour here. This works because
         # os.path.abspath('.') == os.getcwd().
-        return cls('').absolute()
+        return cls().absolute()
 
     def expanduser(self):
         """ Return a new path with expanded ~ and ~user constructs
index d155e7c5bb993509a3a3aa6546b20a01ce84d555..bb2e4187ef95746eb7eb694eee55356611e46486 100644 (file)
@@ -148,6 +148,7 @@ class DummyPurePathTest(unittest.TestCase):
         P = self.cls
         p = P('a')
         self.assertIsInstance(p, P)
+        P()
         P('a', 'b', 'c')
         P('/a', 'b', 'c')
         P('a/b/c')