mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	GH-83863: Drop support for using pathlib.Path objects as context managers (GH-104807)
				
					
				
			In Python 3.8 and prior, `pathlib.Path.__exit__()` marked a path as closed; some subsequent attempts to perform I/O would raise an IOError. This functionality was never documented, and had the effect of making `Path` objects mutable, contrary to PEP 428. In Python 3.9 we made `__exit__()` a no-op, and in 3.11 `__enter__()` began raising deprecation warnings. Here we remove both methods.
This commit is contained in:
		
							parent
							
								
									e0b3078705
								
							
						
					
					
						commit
						6b1510cf11
					
				
					 4 changed files with 7 additions and 39 deletions
				
			
		|  | @ -115,6 +115,9 @@ Removed | |||
|   are now removed. The items in those namespaces can be imported directly | ||||
|   from :mod:`typing`. (Contributed by Sebastian Rittau in :gh:`92871`.) | ||||
| 
 | ||||
| * Remove support for using :class:`pathlib.Path` objects as context managers. | ||||
|   This functionality was deprecated and made a no-op in Python 3.9. | ||||
| 
 | ||||
| Porting to Python 3.13 | ||||
| ====================== | ||||
| 
 | ||||
|  |  | |||
|  | @ -1080,25 +1080,6 @@ def __new__(cls, *args, **kwargs): | |||
|             cls = WindowsPath if os.name == 'nt' else PosixPath | ||||
|         return object.__new__(cls) | ||||
| 
 | ||||
|     def __enter__(self): | ||||
|         # In previous versions of pathlib, __exit__() marked this path as | ||||
|         # closed; subsequent attempts to perform I/O would raise an IOError. | ||||
|         # This functionality was never documented, and had the effect of | ||||
|         # making Path objects mutable, contrary to PEP 428. | ||||
|         # In Python 3.9 __exit__() was made a no-op. | ||||
|         # In Python 3.11 __enter__() began emitting DeprecationWarning. | ||||
|         # In Python 3.13 __enter__() and __exit__() should be removed. | ||||
|         warnings.warn("pathlib.Path.__enter__() is deprecated and scheduled " | ||||
|                       "for removal in Python 3.13; Path objects as a context " | ||||
|                       "manager is a no-op", | ||||
|                       DeprecationWarning, stacklevel=2) | ||||
|         return self | ||||
| 
 | ||||
|     def __exit__(self, t, v, tb): | ||||
|         pass | ||||
| 
 | ||||
|     # Public API | ||||
| 
 | ||||
|     @classmethod | ||||
|     def cwd(cls): | ||||
|         """Return a new path pointing to the current working directory.""" | ||||
|  |  | |||
|  | @ -2080,26 +2080,6 @@ def test_resolve_nonexist_relative_issue38671(self): | |||
|         finally: | ||||
|             os.chdir(old_cwd) | ||||
| 
 | ||||
|     def test_with(self): | ||||
|         p = self.cls(BASE) | ||||
|         it = p.iterdir() | ||||
|         it2 = p.iterdir() | ||||
|         next(it2) | ||||
|         # bpo-46556: path context managers are deprecated in Python 3.11. | ||||
|         with self.assertWarns(DeprecationWarning): | ||||
|             with p: | ||||
|                 pass | ||||
|         # Using a path as a context manager is a no-op, thus the following | ||||
|         # operations should still succeed after the context manage exits. | ||||
|         next(it) | ||||
|         next(it2) | ||||
|         p.exists() | ||||
|         p.resolve() | ||||
|         p.absolute() | ||||
|         with self.assertWarns(DeprecationWarning): | ||||
|             with p: | ||||
|                 pass | ||||
| 
 | ||||
|     @os_helper.skip_unless_working_chmod | ||||
|     def test_chmod(self): | ||||
|         p = self.cls(BASE) / 'fileA' | ||||
|  |  | |||
|  | @ -0,0 +1,4 @@ | |||
| Support for using :class:`pathlib.Path` objects as context managers has been | ||||
| removed. Before Python 3.9, exiting the context manager marked a path as | ||||
| "closed", which caused some (but not all!) methods to raise when called. | ||||
| Since Python 3.9, using a path as a context manager does nothing. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Barney Gale
						Barney Gale