mirror of
https://github.com/python/cpython.git
synced 2025-07-24 03:35:53 +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 @@ class Path(PurePath):
|
||||||
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 @@ class _BasePathTest(object):
|
||||||
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