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 |   are now removed. The items in those namespaces can be imported directly | ||||||
|   from :mod:`typing`. (Contributed by Sebastian Rittau in :gh:`92871`.) |   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 | Porting to Python 3.13 | ||||||
| ====================== | ====================== | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1080,25 +1080,6 @@ def __new__(cls, *args, **kwargs): | ||||||
|             cls = WindowsPath if os.name == 'nt' else PosixPath |             cls = WindowsPath if os.name == 'nt' else PosixPath | ||||||
|         return object.__new__(cls) |         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 |     @classmethod | ||||||
|     def cwd(cls): |     def cwd(cls): | ||||||
|         """Return a new path pointing to the current working directory.""" |         """Return a new path pointing to the current working directory.""" | ||||||
|  |  | ||||||
|  | @ -2080,26 +2080,6 @@ def test_resolve_nonexist_relative_issue38671(self): | ||||||
|         finally: |         finally: | ||||||
|             os.chdir(old_cwd) |             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 |     @os_helper.skip_unless_working_chmod | ||||||
|     def test_chmod(self): |     def test_chmod(self): | ||||||
|         p = self.cls(BASE) / 'fileA' |         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