Skip to content

Commit

Permalink
pythonGH-83863: Drop support for using pathlib.Path objects as cont…
Browse files Browse the repository at this point in the history
…ext managers (pythonGH-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.
  • Loading branch information
barneygale authored May 23, 2023
1 parent e0b3078 commit 6b1510c
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 39 deletions.
3 changes: 3 additions & 0 deletions Doc/whatsnew/3.13.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
======================

Expand Down
19 changes: 0 additions & 19 deletions Lib/pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down
20 changes: 0 additions & 20 deletions Lib/test/test_pathlib.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit 6b1510c

Please sign in to comment.