[Python-checkins] gh-93156 - fix negative indexing into absolute `pathlib.PurePath().parents` (GH-93273)
miss-islington
webhook-mailer at python.org
Fri Jun 3 17:57:57 EDT 2022
https://github.com/python/cpython/commit/9f101c23a41e739f5f80cf38419df1281835d452
commit: 9f101c23a41e739f5f80cf38419df1281835d452
branch: 3.11
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-06-03T14:57:54-07:00
summary:
gh-93156 - fix negative indexing into absolute `pathlib.PurePath().parents` (GH-93273)
When a `_PathParents` object has a drive or a root, the length of the
object is *one less* than than the length of `self._parts`, which resulted
in an off-by-one error when `path.parents[-n]` was fed through to
`self._parts[:-n - 1]`. In particular, `path.parents[-1]` was a malformed
path object with spooky properties.
This is addressed by adding `len(self)` to negative indices.
(cherry picked from commit f32e6b48d12834ba3bde01ec21c14da33abd26d6)
Co-authored-by: Barney Gale <barney.gale at gmail.com>
files:
A Misc/NEWS.d/next/Library/2022-05-26-23-10-55.gh-issue-93156.4XfDVN.rst
M Lib/pathlib.py
M Lib/test/test_pathlib.py
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index 8c1fe30d74b65..9d40d88ef5f2e 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -443,6 +443,8 @@ def __getitem__(self, idx):
if idx >= len(self) or idx < -len(self):
raise IndexError(idx)
+ if idx < 0:
+ idx += len(self)
return self._pathcls._from_parsed_parts(self._drv, self._root,
self._parts[:-idx - 1])
diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
index 72b63d0b6184a..e2da115501abe 100644
--- a/Lib/test/test_pathlib.py
+++ b/Lib/test/test_pathlib.py
@@ -465,6 +465,9 @@ def test_parents_common(self):
self.assertEqual(par[0], P('/a/b'))
self.assertEqual(par[1], P('/a'))
self.assertEqual(par[2], P('/'))
+ self.assertEqual(par[-1], P('/'))
+ self.assertEqual(par[-2], P('/a'))
+ self.assertEqual(par[-3], P('/a/b'))
self.assertEqual(par[0:1], (P('/a/b'),))
self.assertEqual(par[:2], (P('/a/b'), P('/a')))
self.assertEqual(par[:-1], (P('/a/b'), P('/a')))
@@ -472,6 +475,8 @@ def test_parents_common(self):
self.assertEqual(par[::2], (P('/a/b'), P('/')))
self.assertEqual(par[::-1], (P('/'), P('/a'), P('/a/b')))
self.assertEqual(list(par), [P('/a/b'), P('/a'), P('/')])
+ with self.assertRaises(IndexError):
+ par[-4]
with self.assertRaises(IndexError):
par[3]
diff --git a/Misc/NEWS.d/next/Library/2022-05-26-23-10-55.gh-issue-93156.4XfDVN.rst b/Misc/NEWS.d/next/Library/2022-05-26-23-10-55.gh-issue-93156.4XfDVN.rst
new file mode 100644
index 0000000000000..165baa08aaab1
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-05-26-23-10-55.gh-issue-93156.4XfDVN.rst
@@ -0,0 +1,2 @@
+Accessing the :attr:`pathlib.PurePath.parents` sequence of an absolute path
+using negative index values produced incorrect results.
More information about the Python-checkins
mailing list