Skip to content

Commit 4520584

Browse files
author
Joshua Cannon
authored
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)`.
1 parent d20b7ed commit 4520584

File tree

6 files changed

+42
-0
lines changed

6 files changed

+42
-0
lines changed

Doc/library/pathlib.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,8 @@ Pure paths provide the following methods and properties:
336336
>>> p.parents[2]
337337
PureWindowsPath('c:/')
338338

339+
.. versionchanged:: 3.10
340+
Slice support was added.
339341

340342
.. data:: PurePath.parent
341343

Doc/whatsnew/3.10.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,12 @@ descriptors without copying between kernel address space and user
244244
address space, where one of the file descriptors must refer to a
245245
pipe. (Contributed by Pablo Galindo in :issue:`41625`.)
246246

247+
pathlib
248+
-------
249+
250+
Added slice support to :meth:`~pathlib.Path.parents`.
251+
(Contributed by Joshua Cannon in :issue:`35498`)
252+
247253
py_compile
248254
----------
249255

Lib/pathlib.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,8 @@ def __len__(self):
630630
return len(self._parts)
631631

632632
def __getitem__(self, idx):
633+
if isinstance(idx, slice):
634+
return tuple(self[i] for i in range(*idx.indices(len(self))))
633635
if idx < 0 or idx >= len(self):
634636
raise IndexError(idx)
635637
return self._pathcls._from_parsed_parts(self._drv, self._root,

Lib/test/test_pathlib.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,12 @@ def test_parents_common(self):
440440
self.assertEqual(par[0], P('a/b'))
441441
self.assertEqual(par[1], P('a'))
442442
self.assertEqual(par[2], P('.'))
443+
self.assertEqual(par[0:1], (P('a/b'),))
444+
self.assertEqual(par[:2], (P('a/b'), P('a')))
445+
self.assertEqual(par[:-1], (P('a/b'), P('a')))
446+
self.assertEqual(par[1:], (P('a'), P('.')))
447+
self.assertEqual(par[::2], (P('a/b'), P('.')))
448+
self.assertEqual(par[::-1], (P('.'), P('a'), P('a/b')))
443449
self.assertEqual(list(par), [P('a/b'), P('a'), P('.')])
444450
with self.assertRaises(IndexError):
445451
par[-1]
@@ -454,6 +460,12 @@ def test_parents_common(self):
454460
self.assertEqual(par[0], P('/a/b'))
455461
self.assertEqual(par[1], P('/a'))
456462
self.assertEqual(par[2], P('/'))
463+
self.assertEqual(par[0:1], (P('/a/b'),))
464+
self.assertEqual(par[:2], (P('/a/b'), P('/a')))
465+
self.assertEqual(par[:-1], (P('/a/b'), P('/a')))
466+
self.assertEqual(par[1:], (P('/a'), P('/')))
467+
self.assertEqual(par[::2], (P('/a/b'), P('/')))
468+
self.assertEqual(par[::-1], (P('/'), P('/a'), P('/a/b')))
457469
self.assertEqual(list(par), [P('/a/b'), P('/a'), P('/')])
458470
with self.assertRaises(IndexError):
459471
par[3]
@@ -905,6 +917,12 @@ def test_parents(self):
905917
self.assertEqual(len(par), 2)
906918
self.assertEqual(par[0], P('z:a'))
907919
self.assertEqual(par[1], P('z:'))
920+
self.assertEqual(par[0:1], (P('z:a'),))
921+
self.assertEqual(par[:-1], (P('z:a'),))
922+
self.assertEqual(par[:2], (P('z:a'), P('z:')))
923+
self.assertEqual(par[1:], (P('z:'),))
924+
self.assertEqual(par[::2], (P('z:a'),))
925+
self.assertEqual(par[::-1], (P('z:'), P('z:a')))
908926
self.assertEqual(list(par), [P('z:a'), P('z:')])
909927
with self.assertRaises(IndexError):
910928
par[2]
@@ -913,6 +931,12 @@ def test_parents(self):
913931
self.assertEqual(len(par), 2)
914932
self.assertEqual(par[0], P('z:/a'))
915933
self.assertEqual(par[1], P('z:/'))
934+
self.assertEqual(par[0:1], (P('z:/a'),))
935+
self.assertEqual(par[0:-1], (P('z:/a'),))
936+
self.assertEqual(par[:2], (P('z:/a'), P('z:/')))
937+
self.assertEqual(par[1:], (P('z:/'),))
938+
self.assertEqual(par[::2], (P('z:/a'),))
939+
self.assertEqual(par[::-1], (P('z:/'), P('z:/a'),))
916940
self.assertEqual(list(par), [P('z:/a'), P('z:/')])
917941
with self.assertRaises(IndexError):
918942
par[2]
@@ -921,6 +945,12 @@ def test_parents(self):
921945
self.assertEqual(len(par), 2)
922946
self.assertEqual(par[0], P('//a/b/c'))
923947
self.assertEqual(par[1], P('//a/b'))
948+
self.assertEqual(par[0:1], (P('//a/b/c'),))
949+
self.assertEqual(par[0:-1], (P('//a/b/c'),))
950+
self.assertEqual(par[:2], (P('//a/b/c'), P('//a/b')))
951+
self.assertEqual(par[1:], (P('//a/b'),))
952+
self.assertEqual(par[::2], (P('//a/b/c'),))
953+
self.assertEqual(par[::-1], (P('//a/b'), P('//a/b/c')))
924954
self.assertEqual(list(par), [P('//a/b/c'), P('//a/b')])
925955
with self.assertRaises(IndexError):
926956
par[2]

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ Daniel Calvelo
270270
Tony Campbell
271271
Giovanni Cappellotto
272272
Brett Cannon
273+
Joshua Cannon
273274
Tristan Carel
274275
Mike Carlton
275276
Pierre Carrier
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add slice support to :meth:`~pathlib.Path.parents`.

0 commit comments

Comments
 (0)