[Python-checkins] bpo-35498: Added slice support to PathLib parents attribute. (GH-11165)
pganssle
webhook-mailer at python.org
Fri Nov 20 10:40:48 EST 2020
https://github.com/python/cpython/commit/452058448335b39c784af9a047f9c4a1767c0b00
commit: 452058448335b39c784af9a047f9c4a1767c0b00
branch: master
author: Joshua Cannon <joshua.cannon at ni.com>
committer: pganssle <p.ganssle at gmail.com>
date: 2020-11-20T10:40:39-05:00
summary:
bpo-35498: Added slice support to PathLib parents attribute. (GH-11165)
Added slice support to the `pathlib.Path.parents` sequence. For a `Path` `p`, slices of `p.parents` should return the same thing as slices of `tuple(p.parents)`.
files:
A Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst
M Doc/library/pathlib.rst
M Doc/whatsnew/3.10.rst
M Lib/pathlib.py
M Lib/test/test_pathlib.py
M Misc/ACKS
diff --git a/Doc/library/pathlib.rst b/Doc/library/pathlib.rst
index 9de72bb725c75..2071e7ed5f4bf 100644
--- a/Doc/library/pathlib.rst
+++ b/Doc/library/pathlib.rst
@@ -336,6 +336,8 @@ Pure paths provide the following methods and properties:
>>> p.parents[2]
PureWindowsPath('c:/')
+ .. versionchanged:: 3.10
+ Slice support was added.
.. data:: PurePath.parent
diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst
index 826d12704a1c9..16cb7efe2984e 100644
--- a/Doc/whatsnew/3.10.rst
+++ b/Doc/whatsnew/3.10.rst
@@ -244,6 +244,12 @@ descriptors without copying between kernel address space and user
address space, where one of the file descriptors must refer to a
pipe. (Contributed by Pablo Galindo in :issue:`41625`.)
+pathlib
+-------
+
+Added slice support to :meth:`~pathlib.Path.parents`.
+(Contributed by Joshua Cannon in :issue:`35498`)
+
py_compile
----------
diff --git a/Lib/pathlib.py b/Lib/pathlib.py
index 178c5b981d8e5..af310393c3e40 100644
--- a/Lib/pathlib.py
+++ b/Lib/pathlib.py
@@ -630,6 +630,8 @@ def __len__(self):
return len(self._parts)
def __getitem__(self, idx):
+ if isinstance(idx, slice):
+ return tuple(self[i] for i in range(*idx.indices(len(self))))
if idx < 0 or idx >= len(self):
raise IndexError(idx)
return self._pathcls._from_parsed_parts(self._drv, self._root,
diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
index 17292dc1abf73..f1451796b6427 100644
--- a/Lib/test/test_pathlib.py
+++ b/Lib/test/test_pathlib.py
@@ -440,6 +440,12 @@ 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[0:1], (P('a/b'),))
+ self.assertEqual(par[:2], (P('a/b'), P('a')))
+ self.assertEqual(par[:-1], (P('a/b'), P('a')))
+ self.assertEqual(par[1:], (P('a'), P('.')))
+ 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[-1]
@@ -454,6 +460,12 @@ 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[0:1], (P('/a/b'),))
+ self.assertEqual(par[:2], (P('/a/b'), P('/a')))
+ self.assertEqual(par[:-1], (P('/a/b'), P('/a')))
+ self.assertEqual(par[1:], (P('/a'), P('/')))
+ 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[3]
@@ -905,6 +917,12 @@ def test_parents(self):
self.assertEqual(len(par), 2)
self.assertEqual(par[0], P('z:a'))
self.assertEqual(par[1], P('z:'))
+ self.assertEqual(par[0:1], (P('z:a'),))
+ self.assertEqual(par[:-1], (P('z:a'),))
+ self.assertEqual(par[:2], (P('z:a'), P('z:')))
+ self.assertEqual(par[1:], (P('z:'),))
+ self.assertEqual(par[::2], (P('z:a'),))
+ self.assertEqual(par[::-1], (P('z:'), P('z:a')))
self.assertEqual(list(par), [P('z:a'), P('z:')])
with self.assertRaises(IndexError):
par[2]
@@ -913,6 +931,12 @@ def test_parents(self):
self.assertEqual(len(par), 2)
self.assertEqual(par[0], P('z:/a'))
self.assertEqual(par[1], P('z:/'))
+ self.assertEqual(par[0:1], (P('z:/a'),))
+ self.assertEqual(par[0:-1], (P('z:/a'),))
+ self.assertEqual(par[:2], (P('z:/a'), P('z:/')))
+ self.assertEqual(par[1:], (P('z:/'),))
+ self.assertEqual(par[::2], (P('z:/a'),))
+ self.assertEqual(par[::-1], (P('z:/'), P('z:/a'),))
self.assertEqual(list(par), [P('z:/a'), P('z:/')])
with self.assertRaises(IndexError):
par[2]
@@ -921,6 +945,12 @@ def test_parents(self):
self.assertEqual(len(par), 2)
self.assertEqual(par[0], P('//a/b/c'))
self.assertEqual(par[1], P('//a/b'))
+ self.assertEqual(par[0:1], (P('//a/b/c'),))
+ self.assertEqual(par[0:-1], (P('//a/b/c'),))
+ self.assertEqual(par[:2], (P('//a/b/c'), P('//a/b')))
+ self.assertEqual(par[1:], (P('//a/b'),))
+ self.assertEqual(par[::2], (P('//a/b/c'),))
+ self.assertEqual(par[::-1], (P('//a/b'), P('//a/b/c')))
self.assertEqual(list(par), [P('//a/b/c'), P('//a/b')])
with self.assertRaises(IndexError):
par[2]
diff --git a/Misc/ACKS b/Misc/ACKS
index 1d106144d467f..43030caae669d 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -270,6 +270,7 @@ Daniel Calvelo
Tony Campbell
Giovanni Cappellotto
Brett Cannon
+Joshua Cannon
Tristan Carel
Mike Carlton
Pierre Carrier
diff --git a/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst
new file mode 100644
index 0000000000000..fb24ce027c218
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-12-14-13-29-17.bpo-35498.LEJHl7.rst
@@ -0,0 +1 @@
+Add slice support to :meth:`~pathlib.Path.parents`.
More information about the Python-checkins
mailing list