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:
Berker Peksag 2018-08-11 09:05:04 +03:00 committed by GitHub
parent 423d05f6f5
commit 84a13fbda0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 82 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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
========== ==========

View File

@ -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:

View File

@ -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.

View File

@ -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"""

View File

@ -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."""

View File

@ -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', '')

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,3 @@
Deprecate :meth:`__getitem__` methods of
:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper`
and :class:`fileinput.FileInput`.