bpo-9372: Deprecate several __getitem__ methods (GH-8609)
The __getitem__ methods of DOMEventStream, FileInput, and FileWrapper classes ignore their 'index' parameters and return the next item instead.
This commit is contained in:
parent
423d05f6f5
commit
84a13fbda0
|
@ -169,6 +169,9 @@ available for subclassing as well:
|
||||||
.. deprecated-removed:: 3.6 3.8
|
.. deprecated-removed:: 3.6 3.8
|
||||||
The *bufsize* parameter.
|
The *bufsize* parameter.
|
||||||
|
|
||||||
|
.. deprecated:: 3.8
|
||||||
|
Support for :meth:`__getitem__` method is deprecated.
|
||||||
|
|
||||||
|
|
||||||
**Optional in-place filtering:** if the keyword argument ``inplace=True`` is
|
**Optional in-place filtering:** if the keyword argument ``inplace=True`` is
|
||||||
passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the
|
passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the
|
||||||
|
|
|
@ -173,6 +173,8 @@ also provides these miscellaneous utilities:
|
||||||
for chunk in wrapper:
|
for chunk in wrapper:
|
||||||
print(chunk)
|
print(chunk)
|
||||||
|
|
||||||
|
.. deprecated:: 3.8
|
||||||
|
Support for :meth:`sequence protocol <__getitem__>` is deprecated.
|
||||||
|
|
||||||
|
|
||||||
:mod:`wsgiref.headers` -- WSGI response header tools
|
:mod:`wsgiref.headers` -- WSGI response header tools
|
||||||
|
|
|
@ -100,6 +100,8 @@ DOMEventStream Objects
|
||||||
|
|
||||||
.. class:: DOMEventStream(stream, parser, bufsize)
|
.. class:: DOMEventStream(stream, parser, bufsize)
|
||||||
|
|
||||||
|
.. deprecated:: 3.8
|
||||||
|
Support for :meth:`sequence protocol <__getitem__>` is deprecated.
|
||||||
|
|
||||||
.. method:: getEvent()
|
.. method:: getEvent()
|
||||||
|
|
||||||
|
|
|
@ -154,6 +154,15 @@ Build and C API Changes
|
||||||
|
|
||||||
(Contributed by Antoine Pitrou in :issue:`32430`.)
|
(Contributed by Antoine Pitrou in :issue:`32430`.)
|
||||||
|
|
||||||
|
* The :meth:`__getitem__` methods of :class:`xml.dom.pulldom.DOMEventStream`,
|
||||||
|
:class:`wsgiref.util.FileWrapper` and :class:`fileinput.FileInput` have been
|
||||||
|
deprecated.
|
||||||
|
|
||||||
|
Implementations of these methods have been ignoring their *index* parameter,
|
||||||
|
and returning the next item instead.
|
||||||
|
|
||||||
|
(Contributed by Berker Peksag in :issue:`9372`.)
|
||||||
|
|
||||||
|
|
||||||
Deprecated
|
Deprecated
|
||||||
==========
|
==========
|
||||||
|
|
|
@ -259,6 +259,13 @@ class FileInput:
|
||||||
# repeat with next file
|
# repeat with next file
|
||||||
|
|
||||||
def __getitem__(self, i):
|
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():
|
if i != self.lineno():
|
||||||
raise RuntimeError("accessing lines out of order")
|
raise RuntimeError("accessing lines out of order")
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -89,6 +89,7 @@ __all__ = [
|
||||||
"requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
|
"requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
|
||||||
"anticipate_failure", "load_package_tests", "detect_api_mismatch",
|
"anticipate_failure", "load_package_tests", "detect_api_mismatch",
|
||||||
"check__all__", "skip_unless_bind_unix_socket",
|
"check__all__", "skip_unless_bind_unix_socket",
|
||||||
|
"ignore_warnings",
|
||||||
# sys
|
# sys
|
||||||
"is_jython", "is_android", "check_impl_detail", "unix_shell",
|
"is_jython", "is_android", "check_impl_detail", "unix_shell",
|
||||||
"setswitchinterval",
|
"setswitchinterval",
|
||||||
|
@ -138,6 +139,22 @@ def _ignore_deprecated_imports(ignore=True):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
|
|
||||||
|
def ignore_warnings(*, category):
|
||||||
|
"""Decorator to suppress deprecation warnings.
|
||||||
|
|
||||||
|
Use of context managers to hide warnings make diffs
|
||||||
|
more noisy and tools like 'git blame' less useful.
|
||||||
|
"""
|
||||||
|
def decorator(test):
|
||||||
|
@functools.wraps(test)
|
||||||
|
def wrapper(self, *args, **kwargs):
|
||||||
|
with warnings.catch_warnings():
|
||||||
|
warnings.simplefilter('ignore', category=category)
|
||||||
|
return test(self, *args, **kwargs)
|
||||||
|
return wrapper
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
def import_module(name, deprecated=False, *, required_on=()):
|
def import_module(name, deprecated=False, *, required_on=()):
|
||||||
"""Import and return the module to be tested, raising SkipTest if
|
"""Import and return the module to be tested, raising SkipTest if
|
||||||
it is not available.
|
it is not available.
|
||||||
|
|
|
@ -351,6 +351,7 @@ class FileInputTests(BaseTests, unittest.TestCase):
|
||||||
with FileInput(files=[]) as fi:
|
with FileInput(files=[]) as fi:
|
||||||
self.assertEqual(fi._files, ('-',))
|
self.assertEqual(fi._files, ('-',))
|
||||||
|
|
||||||
|
@support.ignore_warnings(category=DeprecationWarning)
|
||||||
def test__getitem__(self):
|
def test__getitem__(self):
|
||||||
"""Tests invoking FileInput.__getitem__() with the current
|
"""Tests invoking FileInput.__getitem__() with the current
|
||||||
line number"""
|
line number"""
|
||||||
|
@ -361,6 +362,14 @@ class FileInputTests(BaseTests, unittest.TestCase):
|
||||||
retval2 = fi[1]
|
retval2 = fi[1]
|
||||||
self.assertEqual(retval2, "line2\n")
|
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")
|
||||||
|
|
||||||
|
@support.ignore_warnings(category=DeprecationWarning)
|
||||||
def test__getitem__invalid_key(self):
|
def test__getitem__invalid_key(self):
|
||||||
"""Tests invoking FileInput.__getitem__() with an index unequal to
|
"""Tests invoking FileInput.__getitem__() with an index unequal to
|
||||||
the line number"""
|
the line number"""
|
||||||
|
@ -370,6 +379,7 @@ class FileInputTests(BaseTests, unittest.TestCase):
|
||||||
fi[1]
|
fi[1]
|
||||||
self.assertEqual(cm.exception.args, ("accessing lines out of order",))
|
self.assertEqual(cm.exception.args, ("accessing lines out of order",))
|
||||||
|
|
||||||
|
@support.ignore_warnings(category=DeprecationWarning)
|
||||||
def test__getitem__eof(self):
|
def test__getitem__eof(self):
|
||||||
"""Tests invoking FileInput.__getitem__() with the line number but at
|
"""Tests invoking FileInput.__getitem__() with the line number but at
|
||||||
end-of-input"""
|
end-of-input"""
|
||||||
|
|
|
@ -159,6 +159,13 @@ 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)
|
||||||
|
|
||||||
|
|
||||||
class ThoroughTestCase(unittest.TestCase):
|
class ThoroughTestCase(unittest.TestCase):
|
||||||
"""Test the hard-to-reach parts of pulldom."""
|
"""Test the hard-to-reach parts of pulldom."""
|
||||||
|
|
|
@ -338,6 +338,7 @@ 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)
|
||||||
|
|
||||||
|
@support.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):
|
||||||
|
@ -356,6 +357,13 @@ 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', '')
|
||||||
|
|
|
@ -18,6 +18,13 @@ class FileWrapper:
|
||||||
self.close = filelike.close
|
self.close = filelike.close
|
||||||
|
|
||||||
def __getitem__(self,key):
|
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)
|
data = self.filelike.read(self.blksize)
|
||||||
if data:
|
if data:
|
||||||
return data
|
return data
|
||||||
|
|
|
@ -217,6 +217,13 @@ class DOMEventStream:
|
||||||
self.parser.setContentHandler(self.pulldom)
|
self.parser.setContentHandler(self.pulldom)
|
||||||
|
|
||||||
def __getitem__(self, pos):
|
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()
|
rc = self.getEvent()
|
||||||
if rc:
|
if rc:
|
||||||
return rc
|
return rc
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Deprecate :meth:`__getitem__` methods of
|
||||||
|
:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper`
|
||||||
|
and :class:`fileinput.FileInput`.
|
Loading…
Reference in New Issue