[Python-checkins] gh-94169: Remove deprecated io.OpenWrapper (#94170)

vstinner webhook-mailer at python.org
Fri Jun 24 02:47:04 EDT 2022


https://github.com/python/cpython/commit/6e33ba114ffb47505fec59674c5cce5eb6476f76
commit: 6e33ba114ffb47505fec59674c5cce5eb6476f76
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2022-06-24T08:46:53+02:00
summary:

gh-94169: Remove deprecated io.OpenWrapper (#94170)

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.

files:
A Misc/NEWS.d/next/Library/2022-06-23-14-35-10.gh-issue-94169.jeba90.rst
M Doc/whatsnew/3.12.rst
M Lib/_pyio.py
M Lib/io.py
M Lib/test/test_io.py

diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst
index 8dde1350a7b16..52e4d7e25b391 100644
--- a/Doc/whatsnew/3.12.rst
+++ b/Doc/whatsnew/3.12.rst
@@ -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
 ======================
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index 0bfdeaafae274..12510784c8b92 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -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:
diff --git a/Lib/io.py b/Lib/io.py
index a205e00575f7e..50ce97436ac1d 100644
--- a/Lib/io.py
+++ b/Lib/io.py
@@ -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"
 
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index 129734b22328e..24c93b969ea2b 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -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
diff --git a/Misc/NEWS.d/next/Library/2022-06-23-14-35-10.gh-issue-94169.jeba90.rst b/Misc/NEWS.d/next/Library/2022-06-23-14-35-10.gh-issue-94169.jeba90.rst
new file mode 100644
index 0000000000000..40c1fc10bc0e4
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-06-23-14-35-10.gh-issue-94169.jeba90.rst
@@ -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.



More information about the Python-checkins mailing list