[Python-checkins] bpo-9372: Deprecate several __getitem__ methods (GH-8609)
Berker Peksag
webhook-mailer at python.org
Sat Aug 11 02:05:07 EDT 2018
https://github.com/python/cpython/commit/84a13fbda0d79789e3c9efcc9f64752261ce1e8d
commit: 84a13fbda0d79789e3c9efcc9f64752261ce1e8d
branch: master
author: Berker Peksag <berker.peksag at gmail.com>
committer: GitHub <noreply at github.com>
date: 2018-08-11T09:05:04+03:00
summary:
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.
files:
A Misc/NEWS.d/next/Library/2018-08-01-21-26-17.bpo-9372.V8Ou3K.rst
M Doc/library/fileinput.rst
M Doc/library/wsgiref.rst
M Doc/library/xml.dom.pulldom.rst
M Doc/whatsnew/3.8.rst
M Lib/fileinput.py
M Lib/test/support/__init__.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 5881fefe2932..f1e29a8a7d85 100644
--- a/Doc/library/fileinput.rst
+++ b/Doc/library/fileinput.rst
@@ -169,6 +169,9 @@ available for subclassing as well:
.. deprecated-removed:: 3.6 3.8
The *bufsize* parameter.
+ .. deprecated:: 3.8
+ Support for :meth:`__getitem__` method is deprecated.
+
**Optional in-place filtering:** if the keyword argument ``inplace=True`` is
passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the
diff --git a/Doc/library/wsgiref.rst b/Doc/library/wsgiref.rst
index 2d9b7b359e80..f8811c5a3617 100644
--- a/Doc/library/wsgiref.rst
+++ b/Doc/library/wsgiref.rst
@@ -173,6 +173,8 @@ also provides these miscellaneous utilities:
for chunk in wrapper:
print(chunk)
+ .. deprecated:: 3.8
+ Support for :meth:`sequence protocol <__getitem__>` is deprecated.
:mod:`wsgiref.headers` -- WSGI response header tools
diff --git a/Doc/library/xml.dom.pulldom.rst b/Doc/library/xml.dom.pulldom.rst
index 5c0f469ad7a5..56f545c0e6d8 100644
--- a/Doc/library/xml.dom.pulldom.rst
+++ b/Doc/library/xml.dom.pulldom.rst
@@ -100,6 +100,8 @@ DOMEventStream Objects
.. class:: DOMEventStream(stream, parser, bufsize)
+ .. deprecated:: 3.8
+ Support for :meth:`sequence protocol <__getitem__>` is deprecated.
.. method:: getEvent()
diff --git a/Doc/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
index 6e0c8b807c00..ef5455a9f6e2 100644
--- a/Doc/whatsnew/3.8.rst
+++ b/Doc/whatsnew/3.8.rst
@@ -154,6 +154,15 @@ Build and C API Changes
(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
==========
diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index c6fc9a1981a1..a7f8df37aada 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -259,6 +259,13 @@ def __next__(self):
# 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:
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index d8dabd435895..13b60f7e8153 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -89,6 +89,7 @@
"requires_IEEE_754", "skip_unless_xattr", "requires_zlib",
"anticipate_failure", "load_package_tests", "detect_api_mismatch",
"check__all__", "skip_unless_bind_unix_socket",
+ "ignore_warnings",
# sys
"is_jython", "is_android", "check_impl_detail", "unix_shell",
"setswitchinterval",
@@ -138,6 +139,22 @@ def _ignore_deprecated_imports(ignore=True):
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=()):
"""Import and return the module to be tested, raising SkipTest if
it is not available.
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py
index c97bb4cb3b02..c5d722e58f59 100644
--- a/Lib/test/test_fileinput.py
+++ b/Lib/test/test_fileinput.py
@@ -351,6 +351,7 @@ def test_empty_files_list_specified_to_constructor(self):
with FileInput(files=[]) as fi:
self.assertEqual(fi._files, ('-',))
+ @support.ignore_warnings(category=DeprecationWarning)
def test__getitem__(self):
"""Tests invoking FileInput.__getitem__() with the current
line number"""
@@ -361,6 +362,14 @@ def test__getitem__(self):
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")
+
+ @support.ignore_warnings(category=DeprecationWarning)
def test__getitem__invalid_key(self):
"""Tests invoking FileInput.__getitem__() with an index unequal to
the line number"""
@@ -370,6 +379,7 @@ def test__getitem__invalid_key(self):
fi[1]
self.assertEqual(cm.exception.args, ("accessing lines out of order",))
+ @support.ignore_warnings(category=DeprecationWarning)
def test__getitem__eof(self):
"""Tests invoking FileInput.__getitem__() with the line number but at
end-of-input"""
diff --git a/Lib/test/test_pulldom.py b/Lib/test/test_pulldom.py
index 3d89e3adda26..f454098c65b1 100644
--- a/Lib/test/test_pulldom.py
+++ b/Lib/test/test_pulldom.py
@@ -159,6 +159,13 @@ 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)
+
class ThoroughTestCase(unittest.TestCase):
"""Test the hard-to-reach parts of pulldom."""
diff --git a/Lib/test/test_wsgiref.py b/Lib/test/test_wsgiref.py
index 8422b308d795..737dfed3a51e 100644
--- a/Lib/test/test_wsgiref.py
+++ b/Lib/test/test_wsgiref.py
@@ -338,6 +338,7 @@ def checkReqURI(self,uri,query=1,**kw):
util.setup_testing_defaults(kw)
self.assertEqual(util.request_uri(kw,query),uri)
+ @support.ignore_warnings(category=DeprecationWarning)
def checkFW(self,text,size,match):
def make_it(text=text,size=size):
@@ -356,6 +357,13 @@ 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 516fe898d014..1cff7a37452e 100644
--- a/Lib/wsgiref/util.py
+++ b/Lib/wsgiref/util.py
@@ -18,6 +18,13 @@ def __init__(self, filelike, blksize=8192):
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
diff --git a/Lib/xml/dom/pulldom.py b/Lib/xml/dom/pulldom.py
index 43504f765616..96a8d59519ef 100644
--- a/Lib/xml/dom/pulldom.py
+++ b/Lib/xml/dom/pulldom.py
@@ -217,6 +217,13 @@ def reset(self):
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
diff --git a/Misc/NEWS.d/next/Library/2018-08-01-21-26-17.bpo-9372.V8Ou3K.rst b/Misc/NEWS.d/next/Library/2018-08-01-21-26-17.bpo-9372.V8Ou3K.rst
new file mode 100644
index 000000000000..8ae5ce118f95
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-08-01-21-26-17.bpo-9372.V8Ou3K.rst
@@ -0,0 +1,3 @@
+Deprecate :meth:`__getitem__` methods of
+:class:`xml.dom.pulldom.DOMEventStream`, :class:`wsgiref.util.FileWrapper`
+and :class:`fileinput.FileInput`.
More information about the Python-checkins
mailing list