mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
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.
This commit is contained in:
parent
cb15afcccf
commit
d003a5bd25
11 changed files with 34 additions and 139 deletions
|
@ -146,11 +146,10 @@ available for subclassing as well:
|
||||||
Class :class:`FileInput` is the implementation; its methods :meth:`filename`,
|
Class :class:`FileInput` is the implementation; its methods :meth:`filename`,
|
||||||
:meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`,
|
:meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`,
|
||||||
:meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the
|
:meth:`isstdin`, :meth:`nextfile` and :meth:`close` correspond to the
|
||||||
functions of the same name in the module. In addition it has a
|
functions of the same name in the module. In addition it is :term:`iterable`
|
||||||
:meth:`~io.TextIOBase.readline` method which returns the next input line,
|
and has a :meth:`~io.TextIOBase.readline` method which returns the next
|
||||||
and a :meth:`__getitem__` method which implements the sequence behavior.
|
input line. The sequence must be accessed in strictly sequential order;
|
||||||
The sequence must be accessed in strictly sequential order; random access
|
random access and :meth:`~io.TextIOBase.readline` cannot be mixed.
|
||||||
and :meth:`~io.TextIOBase.readline` cannot be mixed.
|
|
||||||
|
|
||||||
With *mode* you can specify which file mode will be passed to :func:`open`. It
|
With *mode* you can specify which file mode will be passed to :func:`open`. It
|
||||||
must be one of ``'r'`` and ``'rb'``.
|
must be one of ``'r'`` and ``'rb'``.
|
||||||
|
@ -171,9 +170,6 @@ available for subclassing as well:
|
||||||
.. versionchanged:: 3.2
|
.. versionchanged:: 3.2
|
||||||
Can be used as a context manager.
|
Can be used as a context manager.
|
||||||
|
|
||||||
.. deprecated:: 3.8
|
|
||||||
Support for :meth:`__getitem__` method is deprecated.
|
|
||||||
|
|
||||||
.. versionchanged:: 3.8
|
.. versionchanged:: 3.8
|
||||||
The keyword parameter *mode* and *openhook* are now keyword-only.
|
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.
|
The keyword-only parameter *encoding* and *errors* are added.
|
||||||
|
|
||||||
.. versionchanged:: 3.11
|
.. 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
|
**Optional in-place filtering:** if the keyword argument ``inplace=True`` is
|
||||||
|
|
|
@ -151,8 +151,7 @@ also provides these miscellaneous utilities:
|
||||||
.. class:: FileWrapper(filelike, blksize=8192)
|
.. class:: FileWrapper(filelike, blksize=8192)
|
||||||
|
|
||||||
A wrapper to convert a file-like object to an :term:`iterator`. The resulting objects
|
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
|
are :term`iterable`\ s. As the object is iterated over, the
|
||||||
compatibility with Python 2.1 and Jython. As the object is iterated over, the
|
|
||||||
optional *blksize* parameter will be repeatedly passed to the *filelike*
|
optional *blksize* parameter will be repeatedly passed to the *filelike*
|
||||||
object's :meth:`read` method to obtain bytestrings to yield. When :meth:`read`
|
object's :meth:`read` method to obtain bytestrings to yield. When :meth:`read`
|
||||||
returns an empty bytestring, iteration is ended and is not resumable.
|
returns an empty bytestring, iteration is ended and is not resumable.
|
||||||
|
@ -173,8 +172,8 @@ also provides these miscellaneous utilities:
|
||||||
for chunk in wrapper:
|
for chunk in wrapper:
|
||||||
print(chunk)
|
print(chunk)
|
||||||
|
|
||||||
.. deprecated:: 3.8
|
.. versionchanged:: 3.11
|
||||||
Support for :meth:`sequence protocol <__getitem__>` is deprecated.
|
Support for :meth:`__getitem__` method has been removed.
|
||||||
|
|
||||||
|
|
||||||
:mod:`wsgiref.headers` -- WSGI response header tools
|
:mod:`wsgiref.headers` -- WSGI response header tools
|
||||||
|
|
|
@ -114,8 +114,8 @@ DOMEventStream Objects
|
||||||
|
|
||||||
.. class:: DOMEventStream(stream, parser, bufsize)
|
.. class:: DOMEventStream(stream, parser, bufsize)
|
||||||
|
|
||||||
.. deprecated:: 3.8
|
.. versionchanged:: 3.11
|
||||||
Support for :meth:`sequence protocol <__getitem__>` is deprecated.
|
Support for :meth:`__getitem__` method has been removed.
|
||||||
|
|
||||||
.. method:: getEvent()
|
.. method:: getEvent()
|
||||||
|
|
||||||
|
@ -144,4 +144,3 @@ DOMEventStream Objects
|
||||||
print(node.toxml())
|
print(node.toxml())
|
||||||
|
|
||||||
.. method:: DOMEventStream.reset()
|
.. method:: DOMEventStream.reset()
|
||||||
|
|
||||||
|
|
|
@ -254,6 +254,12 @@ Removed
|
||||||
Use ``bdist_wheel`` (wheel packages) instead.
|
Use ``bdist_wheel`` (wheel packages) instead.
|
||||||
(Contributed by Hugo van Kemenade in :issue:`45124`.)
|
(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
|
Optimizations
|
||||||
=============
|
=============
|
||||||
|
|
||||||
|
|
|
@ -257,21 +257,6 @@ class FileInput:
|
||||||
self.nextfile()
|
self.nextfile()
|
||||||
# repeat with next file
|
# 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):
|
def nextfile(self):
|
||||||
savestdout = self._savestdout
|
savestdout = self._savestdout
|
||||||
self._savestdout = None
|
self._savestdout = None
|
||||||
|
|
|
@ -29,7 +29,6 @@ from test.support import verbose
|
||||||
from test.support.os_helper import TESTFN
|
from test.support.os_helper import TESTFN
|
||||||
from test.support.os_helper import unlink as safe_unlink
|
from test.support.os_helper import unlink as safe_unlink
|
||||||
from test.support import os_helper
|
from test.support import os_helper
|
||||||
from test.support import warnings_helper
|
|
||||||
from test import support
|
from test import support
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
|
@ -357,44 +356,6 @@ class FileInputTests(BaseTests, unittest.TestCase):
|
||||||
with FileInput(files=[], encoding="utf-8") as fi:
|
with FileInput(files=[], encoding="utf-8") as fi:
|
||||||
self.assertEqual(fi._files, ('-',))
|
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):
|
def test_nextfile_oserror_deleting_backup(self):
|
||||||
"""Tests invoking FileInput.nextfile() when the attempt to delete
|
"""Tests invoking FileInput.nextfile() when the attempt to delete
|
||||||
the backup file would raise OSError. This error is expected to be
|
the backup file would raise OSError. This error is expected to be
|
||||||
|
|
|
@ -160,13 +160,6 @@ class PullDOMTestCase(unittest.TestCase):
|
||||||
self.fail(
|
self.fail(
|
||||||
"Ran out of events, but should have received END_DOCUMENT")
|
"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):
|
def test_external_ges_default(self):
|
||||||
parser = pulldom.parseString(SMALL_SAMPLE)
|
parser = pulldom.parseString(SMALL_SAMPLE)
|
||||||
saxparser = parser.parser
|
saxparser = parser.parser
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
from test import support
|
from test import support
|
||||||
from test.support import socket_helper
|
from test.support import socket_helper
|
||||||
from test.support import warnings_helper
|
|
||||||
from test.test_httpservers import NoLogRequestHandler
|
from test.test_httpservers import NoLogRequestHandler
|
||||||
from unittest import TestCase
|
from unittest import TestCase
|
||||||
from wsgiref.util import setup_testing_defaults
|
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()
|
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(),
|
def compare_generic_iter(make_it, match):
|
||||||
as well as __getitem__. 'make_it' must be a function returning a fresh
|
"""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)."""
|
iterator to be tested (since this may test the iterator twice)."""
|
||||||
|
|
||||||
it = make_it()
|
it = make_it()
|
||||||
n = 0
|
if not iter(it) is it:
|
||||||
|
raise AssertionError
|
||||||
for item in match:
|
for item in match:
|
||||||
if not it[n]==item: raise AssertionError
|
if not next(it) == item:
|
||||||
n+=1
|
raise AssertionError
|
||||||
try:
|
try:
|
||||||
it[n]
|
next(it)
|
||||||
except IndexError:
|
except StopIteration:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
raise AssertionError("Too many items from __getitem__",it)
|
raise AssertionError("Too many items from .__next__()", 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)
|
|
||||||
|
|
||||||
|
|
||||||
class IntegrationTests(TestCase):
|
class IntegrationTests(TestCase):
|
||||||
|
@ -340,7 +324,6 @@ class UtilityTests(TestCase):
|
||||||
util.setup_testing_defaults(kw)
|
util.setup_testing_defaults(kw)
|
||||||
self.assertEqual(util.request_uri(kw,query),uri)
|
self.assertEqual(util.request_uri(kw,query),uri)
|
||||||
|
|
||||||
@warnings_helper.ignore_warnings(category=DeprecationWarning)
|
|
||||||
def checkFW(self,text,size,match):
|
def checkFW(self,text,size,match):
|
||||||
|
|
||||||
def make_it(text=text,size=size):
|
def make_it(text=text,size=size):
|
||||||
|
@ -359,13 +342,6 @@ class UtilityTests(TestCase):
|
||||||
it.close()
|
it.close()
|
||||||
self.assertTrue(it.filelike.closed)
|
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):
|
def testSimpleShifts(self):
|
||||||
self.checkShift('','/', '', '/', '')
|
self.checkShift('','/', '', '/', '')
|
||||||
self.checkShift('','/x', 'x', '/x', '')
|
self.checkShift('','/x', 'x', '/x', '')
|
||||||
|
|
|
@ -17,19 +17,6 @@ class FileWrapper:
|
||||||
if hasattr(filelike,'close'):
|
if hasattr(filelike,'close'):
|
||||||
self.close = 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):
|
def __iter__(self):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
|
|
@ -216,19 +216,6 @@ class DOMEventStream:
|
||||||
self.parser.setFeature(xml.sax.handler.feature_namespaces, 1)
|
self.parser.setFeature(xml.sax.handler.feature_namespaces, 1)
|
||||||
self.parser.setContentHandler(self.pulldom)
|
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):
|
def __next__(self):
|
||||||
rc = self.getEvent()
|
rc = self.getEvent()
|
||||||
if rc:
|
if rc:
|
||||||
|
|
|
@ -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.
|
Loading…
Add table
Add a link
Reference in a new issue