mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									1a8a0ddb1c
								
							
						
					
					
						commit
						f32e6b48d1
					
				
					 3 changed files with 9 additions and 0 deletions
				
			
		|  | @ -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]) | ||||
| 
 | ||||
|  |  | |||
|  | @ -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] | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,2 @@ | |||
| Accessing the :attr:`pathlib.PurePath.parents` sequence of an absolute path | ||||
| using negative index values produced incorrect results. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Barney Gale
						Barney Gale