[Python-checkins] bpo-45132 Remove deprecated __getitem__ methods (GH-28225)

serhiy-storchaka webhook-mailer at python.org
Wed Sep 8 06:07:48 EDT 2021


https://github.com/python/cpython/commit/d003a5bd2505a7fa04f50504b68ba8fca67349cd
commit: d003a5bd2505a7fa04f50504b68ba8fca67349cd
branch: main
author: Hugo van Kemenade <hugovk at users.noreply.github.com>
committer: serhiy-storchaka <storchaka at gmail.com>
date: 2021-09-08T13:07:40+03:00
summary:

bpo-45132 Remove deprecated __getitem__ methods (GH-28225)

Remove deprecated __getitem__ methods of xml.dom.pulldom.DOMEventStream,
wsgiref.util.FileWrapper and fileinput.FileInput, deprecated since Python 3.9.

files:
A Misc/NEWS.d/next/Library/2021-09-07-16-33-51.bpo-45132.WI9zQY.rst
M Doc/library/fileinput.rst
M Doc/library/wsgiref.rst
M Doc/library/xml.dom.pulldom.rst
M Doc/whatsnew/3.11.rst
M Lib/fileinput.py
M Lib/test/test_fileinput.py
M Lib/test/test_pulldom.py
M Lib/test/test_wsgiref.py
M Lib/wsgiref/util.py
M Lib/xml/dom/pulldom.py

diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst
index 9f7802dd4566da..731c3d0c99a8cd 100644
--- a/Doc/library/fileinput.rst
+++ b/Doc/library/fileinput.rst
@@ -146,11 +146,10 @@ available for subclassing as well:
    Class :class:`FileInput` is the implementation; its methods :meth:`filename`,
    :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`,
    :meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the
-   functions of the same name in the module. In addition it has a
-   :meth:`~io.TextIOBase.readline` method which returns the next input line,
-   and a :meth:`__getitem__` method which implements the sequence behavior.
-   The sequence must be accessed in strictly sequential order; random access
-   and :meth:`~io.TextIOBase.readline` cannot be mixed.
+   functions of the same name in the module. In addition it is :term:`iterable`
+   and has a :meth:`~io.TextIOBase.readline` method which returns the next
+   input line. The sequence must be accessed in strictly sequential order;
+   random access and :meth:`~io.TextIOBase.readline` cannot be mixed.
 
    With *mode* you can specify which file mode will be passed to :func:`open`. It
    must be one of ``'r'`` and ``'rb'``.
@@ -171,9 +170,6 @@ available for subclassing as well:
    .. versionchanged:: 3.2
       Can be used as a context manager.
 
-   .. deprecated:: 3.8
-      Support for :meth:`__getitem__` method is deprecated.
-
    .. versionchanged:: 3.8
       The keyword parameter *mode* and *openhook* are now keyword-only.
 
@@ -181,7 +177,8 @@ available for subclassing as well:
       The keyword-only parameter *encoding* and *errors* are added.
 
    .. versionchanged:: 3.11
-      The ``'rU'`` and ``'U'`` modes have been removed.
+      The ``'rU'`` and ``'U'`` modes and the :meth:`__getitem__` method have
+      been removed.
 
 
 **Optional in-place filtering:** if the keyword argument ``inplace=True`` is
diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst
index e92a689de0b9ba..5454b1132d2b6c 100644
--- a/Doc/library/wsgiref.rst
+++ b/Doc/library/wsgiref.rst
@@ -151,8 +151,7 @@ also provides these miscellaneous utilities:
 .. class:: FileWrapper(filelike, blksize=8192)
 
    A wrapper to convert a file-like object to an :term:`iterator`.  The resulting objects
-   support both :meth:`__getitem__` and :meth:`__iter__` iteration styles, for
-   compatibility with Python 2.1 and Jython. As the object is iterated over, the
+   are :term`iterable`\ s. As the object is iterated over, the
    optional *blksize* parameter will be repeatedly passed to the *filelike*
    object's :meth:`read` method to obtain bytestrings to yield.  When :meth:`read`
    returns an empty bytestring, iteration is ended and is not resumable.
@@ -173,8 +172,8 @@ also provides these miscellaneous utilities:
       for chunk in wrapper:
           print(chunk)
 
-   .. deprecated:: 3.8
-      Support for :meth:`sequence protocol <__getitem__>` is deprecated.
+   .. versionchanged:: 3.11
+      Support for :meth:`__getitem__` method has been removed.
 
 
 :mod:`wsgiref.headers` -- WSGI response header tools
diff --git a/Doc/library/xml.dom.pulldom.rst b/Doc/library/xml.dom.pulldom.rst
index 660c75c1a1b340..d1df465a598e53 100644
--- a/Doc/library/xml.dom.pulldom.rst
+++ b/Doc/library/xml.dom.pulldom.rst
@@ -114,8 +114,8 @@ DOMEventStream Objects
 
 .. class:: DOMEventStream(stream, parser, bufsize)
 
-   .. deprecated:: 3.8
-      Support for :meth:`sequence protocol <__getitem__>` is deprecated.
+   .. versionchanged:: 3.11
+      Support for :meth:`__getitem__` method has been removed.
 
    .. method:: getEvent()
 
@@ -144,4 +144,3 @@ DOMEventStream Objects
                   print(node.toxml())
 
    .. method:: DOMEventStream.reset()
-
diff --git a/Doc/whatsnew/3.11.rst b/Doc/whatsnew/3.11.rst
index 30ee182718ddb6..55ba8329a1f781 100644
--- a/Doc/whatsnew/3.11.rst
+++ b/Doc/whatsnew/3.11.rst
@@ -254,6 +254,12 @@ Removed
   Use ``bdist_wheel`` (wheel packages) instead.
   (Contributed by Hugo van Kemenade in :issue:`45124`.)
 
+* Remove :meth:`__getitem__` methods of
+  :class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper`
+  and :class:`fileinput.FileInput`, deprecated since Python 3.9.
+  (Contributed by Hugo van Kemenade in :issue:`45132`.)
+
+
 Optimizations
 =============
 
diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index d0b3caae5d6e48..9f41c18510decf 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -257,21 +257,6 @@ def __next__(self):
             self.nextfile()
             # repeat with next file
 
-    def __getitem__(self, i):
-        import warnings
-        warnings.warn(
-            "Support for indexing FileInput objects is deprecated. "
-            "Use iterator protocol instead.",
-            DeprecationWarning,
-            stacklevel=2
-        )
-        if i != self.lineno():
-            raise RuntimeError("accessing lines out of order")
-        try:
-            return self.__next__()
-        except StopIteration:
-            raise IndexError("end of input reached")
-
     def nextfile(self):
         savestdout = self._savestdout
         self._savestdout = None
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py
index 31684aefdb0eb7..819200010a2230 100644
--- a/Lib/test/test_fileinput.py
+++ b/Lib/test/test_fileinput.py
@@ -29,7 +29,6 @@
 from test.support.os_helper import TESTFN
 from test.support.os_helper import unlink as safe_unlink
 from test.support import os_helper
-from test.support import warnings_helper
 from test import support
 from unittest import mock
 
@@ -357,44 +356,6 @@ def test_empty_files_list_specified_to_constructor(self):
         with FileInput(files=[], encoding="utf-8") as fi:
             self.assertEqual(fi._files, ('-',))
 
-    @warnings_helper.ignore_warnings(category=DeprecationWarning)
-    def test__getitem__(self):
-        """Tests invoking FileInput.__getitem__() with the current
-           line number"""
-        t = self.writeTmp("line1\nline2\n")
-        with FileInput(files=[t], encoding="utf-8") as fi:
-            retval1 = fi[0]
-            self.assertEqual(retval1, "line1\n")
-            retval2 = fi[1]
-            self.assertEqual(retval2, "line2\n")
-
-    def test__getitem___deprecation(self):
-        t = self.writeTmp("line1\nline2\n")
-        with self.assertWarnsRegex(DeprecationWarning,
-                                   r'Use iterator protocol instead'):
-            with FileInput(files=[t]) as fi:
-                self.assertEqual(fi[0], "line1\n")
-
-    @warnings_helper.ignore_warnings(category=DeprecationWarning)
-    def test__getitem__invalid_key(self):
-        """Tests invoking FileInput.__getitem__() with an index unequal to
-           the line number"""
-        t = self.writeTmp("line1\nline2\n")
-        with FileInput(files=[t], encoding="utf-8") as fi:
-            with self.assertRaises(RuntimeError) as cm:
-                fi[1]
-        self.assertEqual(cm.exception.args, ("accessing lines out of order",))
-
-    @warnings_helper.ignore_warnings(category=DeprecationWarning)
-    def test__getitem__eof(self):
-        """Tests invoking FileInput.__getitem__() with the line number but at
-           end-of-input"""
-        t = self.writeTmp('')
-        with FileInput(files=[t], encoding="utf-8") as fi:
-            with self.assertRaises(IndexError) as cm:
-                fi[0]
-        self.assertEqual(cm.exception.args, ("end of input reached",))
-
     def test_nextfile_oserror_deleting_backup(self):
         """Tests invoking FileInput.nextfile() when the attempt to delete
            the backup file would raise OSError.  This error is expected to be
diff --git a/Lib/test/test_pulldom.py b/Lib/test/test_pulldom.py
index 4a1bad3442b25b..6dc51e4371d0f6 100644
--- a/Lib/test/test_pulldom.py
+++ b/Lib/test/test_pulldom.py
@@ -160,13 +160,6 @@ def test_end_document(self):
             self.fail(
                 "Ran out of events, but should have received END_DOCUMENT")
 
-    def test_getitem_deprecation(self):
-        parser = pulldom.parseString(SMALL_SAMPLE)
-        with self.assertWarnsRegex(DeprecationWarning,
-                                   r'Use iterator protocol instead'):
-            # This should have returned 'END_ELEMENT'.
-            self.assertEqual(parser[-1][0], pulldom.START_DOCUMENT)
-
     def test_external_ges_default(self):
         parser = pulldom.parseString(SMALL_SAMPLE)
         saxparser = parser.parser
diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py
index 93ca6b99a92c9c..cf40e5a5c85d2e 100644
--- a/Lib/test/test_wsgiref.py
+++ b/Lib/test/test_wsgiref.py
@@ -1,7 +1,6 @@
 from unittest import mock
 from test import support
 from test.support import socket_helper
-from test.support import warnings_helper
 from test.test_httpservers import NoLogRequestHandler
 from unittest import TestCase
 from wsgiref.util import setup_testing_defaults
@@ -81,41 +80,26 @@ def run_amock(app=hello_app, data=b"GET / HTTP/1.0\n\n"):
 
     return out.getvalue(), err.getvalue()
 
-def compare_generic_iter(make_it,match):
-    """Utility to compare a generic 2.1/2.2+ iterator with an iterable
 
-    If running under Python 2.2+, this tests the iterator using iter()/next(),
-    as well as __getitem__.  'make_it' must be a function returning a fresh
+def compare_generic_iter(make_it, match):
+    """Utility to compare a generic iterator with an iterable
+
+    This tests the iterator using iter()/next().
+    'make_it' must be a function returning a fresh
     iterator to be tested (since this may test the iterator twice)."""
 
     it = make_it()
-    n = 0
+    if not iter(it) is it:
+        raise AssertionError
     for item in match:
-        if not it[n]==item: raise AssertionError
-        n+=1
+        if not next(it) == item:
+            raise AssertionError
     try:
-        it[n]
-    except IndexError:
+        next(it)
+    except StopIteration:
         pass
     else:
-        raise AssertionError("Too many items from __getitem__",it)
-
-    try:
-        iter, StopIteration
-    except NameError:
-        pass
-    else:
-        # Only test iter mode under 2.2+
-        it = make_it()
-        if not iter(it) is it: raise AssertionError
-        for item in match:
-            if not next(it) == item: raise AssertionError
-        try:
-            next(it)
-        except StopIteration:
-            pass
-        else:
-            raise AssertionError("Too many items from .__next__()", it)
+        raise AssertionError("Too many items from .__next__()", it)
 
 
 class IntegrationTests(TestCase):
@@ -340,7 +324,6 @@ def checkReqURI(self,uri,query=1,**kw):
         util.setup_testing_defaults(kw)
         self.assertEqual(util.request_uri(kw,query),uri)
 
-    @warnings_helper.ignore_warnings(category=DeprecationWarning)
     def checkFW(self,text,size,match):
 
         def make_it(text=text,size=size):
@@ -359,13 +342,6 @@ def make_it(text=text,size=size):
         it.close()
         self.assertTrue(it.filelike.closed)
 
-    def test_filewrapper_getitem_deprecation(self):
-        wrapper = util.FileWrapper(StringIO('foobar'), 3)
-        with self.assertWarnsRegex(DeprecationWarning,
-                                   r'Use iterator protocol instead'):
-            # This should have returned 'bar'.
-            self.assertEqual(wrapper[1], 'foo')
-
     def testSimpleShifts(self):
         self.checkShift('','/', '', '/', '')
         self.checkShift('','/x', 'x', '/x', '')
diff --git a/Lib/wsgiref/util.py b/Lib/wsgiref/util.py
index cac52eb5a555d1..cbbe094cba1624 100644
--- a/Lib/wsgiref/util.py
+++ b/Lib/wsgiref/util.py
@@ -17,19 +17,6 @@ def __init__(self, filelike, blksize=8192):
         if hasattr(filelike,'close'):
             self.close = filelike.close
 
-    def __getitem__(self,key):
-        import warnings
-        warnings.warn(
-            "FileWrapper's __getitem__ method ignores 'key' parameter. "
-            "Use iterator protocol instead.",
-            DeprecationWarning,
-            stacklevel=2
-        )
-        data = self.filelike.read(self.blksize)
-        if data:
-            return data
-        raise IndexError
-
     def __iter__(self):
         return self
 
diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py
index 96a8d59519ef45..913141cd7ef3ce 100644
--- a/Lib/xml/dom/pulldom.py
+++ b/Lib/xml/dom/pulldom.py
@@ -216,19 +216,6 @@ def reset(self):
         self.parser.setFeature(xml.sax.handler.feature_namespaces, 1)
         self.parser.setContentHandler(self.pulldom)
 
-    def __getitem__(self, pos):
-        import warnings
-        warnings.warn(
-            "DOMEventStream's __getitem__ method ignores 'pos' parameter. "
-            "Use iterator protocol instead.",
-            DeprecationWarning,
-            stacklevel=2
-        )
-        rc = self.getEvent()
-        if rc:
-            return rc
-        raise IndexError
-
     def __next__(self):
         rc = self.getEvent()
         if rc:
diff --git a/Misc/NEWS.d/next/Library/2021-09-07-16-33-51.bpo-45132.WI9zQY.rst b/Misc/NEWS.d/next/Library/2021-09-07-16-33-51.bpo-45132.WI9zQY.rst
new file mode 100644
index 00000000000000..10f24003dc71fe
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-09-07-16-33-51.bpo-45132.WI9zQY.rst
@@ -0,0 +1,5 @@
+Remove :meth:`__getitem__` methods of
+:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper`
+and :class:`fileinput.FileInput`, deprecated since Python 3.9.
+
+Patch by Hugo van Kemenade.



More information about the Python-checkins mailing list