Skip to content

Commit

Permalink
gh-94169: Remove deprecated io.OpenWrapper (#94170)
Browse files Browse the repository at this point in the history
Remove io.OpenWrapper and _pyio.OpenWrapper, deprecated in Python
3.10: just use :func:`open` instead. The open() (io.open()) function
is a built-in function. Since Python 3.10, _pyio.open() is also a
static method.
  • Loading branch information
vstinner committed Jun 24, 2022
1 parent 5075e81 commit 6e33ba1
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 40 deletions.
6 changes: 6 additions & 0 deletions Doc/whatsnew/3.12.rst
Expand Up @@ -208,6 +208,12 @@ Removed
(and corresponding ``EXPERIMENTAL_ISOLATED_SUBINTERPRETERS``)
have been removed.

* Remove ``io.OpenWrapper`` and ``_pyio.OpenWrapper``, deprecated in Python
3.10: just use :func:`open` instead. The :func:`open` (:func:`io.open`)
function is a built-in function. Since Python 3.10, :func:`_pyio.open` is
also a static method.
(Contributed by Victor Stinner in :gh:`94169`.)


Porting to Python 3.12
======================
Expand Down
16 changes: 0 additions & 16 deletions Lib/_pyio.py
Expand Up @@ -303,22 +303,6 @@ def _open_code_with_warning(path):
open_code = _open_code_with_warning


def __getattr__(name):
if name == "OpenWrapper":
# bpo-43680: Until Python 3.9, _pyio.open was not a static method and
# builtins.open was set to OpenWrapper to not become a bound method
# when set to a class variable. _io.open is a built-in function whereas
# _pyio.open is a Python function. In Python 3.10, _pyio.open() is now
# a static method, and builtins.open() is now io.open().
import warnings
warnings.warn('OpenWrapper is deprecated, use open instead',
DeprecationWarning, stacklevel=2)
global OpenWrapper
OpenWrapper = open
return OpenWrapper
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")


# In normal operation, both `UnsupportedOperation`s should be bound to the
# same object.
try:
Expand Down
16 changes: 0 additions & 16 deletions Lib/io.py
Expand Up @@ -57,22 +57,6 @@
IncrementalNewlineDecoder, text_encoding, TextIOWrapper)


def __getattr__(name):
if name == "OpenWrapper":
# bpo-43680: Until Python 3.9, _pyio.open was not a static method and
# builtins.open was set to OpenWrapper to not become a bound method
# when set to a class variable. _io.open is a built-in function whereas
# _pyio.open is a Python function. In Python 3.10, _pyio.open() is now
# a static method, and builtins.open() is now io.open().
import warnings
warnings.warn('OpenWrapper is deprecated, use open instead',
DeprecationWarning, stacklevel=2)
global OpenWrapper
OpenWrapper = open
return OpenWrapper
raise AttributeError("module {__name__!r} has no attribute {name!r}")


# Pretend this exception was created here.
UnsupportedOperation.__module__ = "io"

Expand Down
8 changes: 0 additions & 8 deletions Lib/test/test_io.py
Expand Up @@ -4301,14 +4301,6 @@ def test_text_encoding(self):
proc = assert_python_ok('-X', 'utf8=1', '-c', code)
self.assertEqual(b"utf-8", proc.out.strip())

@support.cpython_only
# Depending if OpenWrapper was already created or not, the warning is
# emitted or not. For example, the attribute is already created when this
# test is run multiple times.
@warnings_helper.ignore_warnings(category=DeprecationWarning)
def test_openwrapper(self):
self.assertIs(self.io.OpenWrapper, self.io.open)


class CMiscIOTest(MiscIOTest):
io = io
Expand Down
@@ -0,0 +1,4 @@
Remove ``io.OpenWrapper`` and ``_pyio.OpenWrapper``, deprecated in Python
3.10: just use :func:`open` instead. The :func:`open` (:func:`io.open`)
function is a built-in function. Since Python 3.10, :func:`_pyio.open` is
also a static method. Patch by Victor Stinner.

0 comments on commit 6e33ba1

Please sign in to comment.