mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	bpo-34775: Return NotImplemented in PurePath division. (GH-9509)
This commit is contained in:
		
							parent
							
								
									0378d98678
								
							
						
					
					
						commit
						4c69be22df
					
				
					 3 changed files with 52 additions and 2 deletions
				
			
		|  | @ -907,10 +907,16 @@ def joinpath(self, *args): | ||||||
|         return self._make_child(args) |         return self._make_child(args) | ||||||
| 
 | 
 | ||||||
|     def __truediv__(self, key): |     def __truediv__(self, key): | ||||||
|  |         try: | ||||||
|             return self._make_child((key,)) |             return self._make_child((key,)) | ||||||
|  |         except TypeError: | ||||||
|  |             return NotImplemented | ||||||
| 
 | 
 | ||||||
|     def __rtruediv__(self, key): |     def __rtruediv__(self, key): | ||||||
|  |         try: | ||||||
|             return self._from_parts([key] + self._parts) |             return self._from_parts([key] + self._parts) | ||||||
|  |         except TypeError: | ||||||
|  |             return NotImplemented | ||||||
| 
 | 
 | ||||||
|     @property |     @property | ||||||
|     def parent(self): |     def parent(self): | ||||||
|  |  | ||||||
|  | @ -2329,5 +2329,46 @@ def check(): | ||||||
|             check() |             check() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | class CompatiblePathTest(unittest.TestCase): | ||||||
|  |     """ | ||||||
|  |     Test that a type can be made compatible with PurePath | ||||||
|  |     derivatives by implementing division operator overloads. | ||||||
|  |     """ | ||||||
|  | 
 | ||||||
|  |     class CompatPath: | ||||||
|  |         """ | ||||||
|  |         Minimum viable class to test PurePath compatibility. | ||||||
|  |         Simply uses the division operator to join a given | ||||||
|  |         string and the string value of another object with | ||||||
|  |         a forward slash. | ||||||
|  |         """ | ||||||
|  |         def __init__(self, string): | ||||||
|  |             self.string = string | ||||||
|  | 
 | ||||||
|  |         def __truediv__(self, other): | ||||||
|  |             return type(self)(f"{self.string}/{other}") | ||||||
|  | 
 | ||||||
|  |         def __rtruediv__(self, other): | ||||||
|  |             return type(self)(f"{other}/{self.string}") | ||||||
|  | 
 | ||||||
|  |     def test_truediv(self): | ||||||
|  |         result = pathlib.PurePath("test") / self.CompatPath("right") | ||||||
|  |         self.assertIsInstance(result, self.CompatPath) | ||||||
|  |         self.assertEqual(result.string, "test/right") | ||||||
|  | 
 | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             # Verify improper operations still raise a TypeError | ||||||
|  |             pathlib.PurePath("test") / 10 | ||||||
|  | 
 | ||||||
|  |     def test_rtruediv(self): | ||||||
|  |         result = self.CompatPath("left") / pathlib.PurePath("test") | ||||||
|  |         self.assertIsInstance(result, self.CompatPath) | ||||||
|  |         self.assertEqual(result.string, "left/test") | ||||||
|  | 
 | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             # Verify improper operations still raise a TypeError | ||||||
|  |             10 / pathlib.PurePath("test") | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| if __name__ == "__main__": | if __name__ == "__main__": | ||||||
|     unittest.main() |     unittest.main() | ||||||
|  |  | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | Division handling of PurePath now returns NotImplemented instead of raising | ||||||
|  | a TypeError when passed something other than an instance of str or PurePath. | ||||||
|  | Patch by Roger Aiudi. | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 aiudirog
						aiudirog