[Python-checkins] bpo-36952: Remove the bufsize parameter in fileinput.input(). (GH-13400)

Serhiy Storchaka webhook-mailer at python.org
Mon May 20 16:44:16 EDT 2019


https://github.com/python/cpython/commit/1a3faf9d9740a8c7505c61839ef09929a7ff9e35
commit: 1a3faf9d9740a8c7505c61839ef09929a7ff9e35
branch: master
author: Matthias Bussonnier <mbussonnier at ucmerced.edu>
committer: Serhiy Storchaka <storchaka at gmail.com>
date: 2019-05-20T23:44:11+03:00
summary:

bpo-36952: Remove the bufsize parameter in fileinput.input(). (GH-13400)

This parameter is marked as deprecated since 3.6 and for removal in 3.8.
It already had no effects.

files:
A Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst
M Doc/library/fileinput.rst
M Doc/whatsnew/3.8.rst
M Lib/fileinput.py
M Lib/test/test_fileinput.py

diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst
index af9dff34a808..14be492f55a6 100644
--- a/Doc/library/fileinput.rst
+++ b/Doc/library/fileinput.rst
@@ -54,7 +54,7 @@ provided by this module.
 The following function is the primary interface of this module:
 
 
-.. function:: input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)
+.. function:: input(files=None, inplace=False, backup='', *, mode='r', openhook=None)
 
    Create an instance of the :class:`FileInput` class.  The instance will be used
    as global state for the functions of this module, and is also returned to use
@@ -72,8 +72,9 @@ The following function is the primary interface of this module:
    .. versionchanged:: 3.2
       Can be used as a context manager.
 
-   .. deprecated-removed:: 3.6 3.8
-      The *bufsize* parameter.
+   .. versionchanged:: 3.8
+      The keyword parameters *mode* and *openhook* are now keyword-only.
+
 
 The following functions use the global state created by :func:`fileinput.input`;
 if there is no active state, :exc:`RuntimeError` is raised.
@@ -135,7 +136,7 @@ The class which implements the sequence behavior provided by the module is
 available for subclassing as well:
 
 
-.. class:: FileInput(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)
+.. class:: FileInput(files=None, inplace=False, backup='', *, mode='r', openhook=None)
 
    Class :class:`FileInput` is the implementation; its methods :meth:`filename`,
    :meth:`fileno`, :meth:`lineno`, :meth:`filelineno`, :meth:`isfirstline`,
@@ -160,18 +161,20 @@ available for subclassing as well:
       with FileInput(files=('spam.txt', 'eggs.txt')) as input:
           process(input)
 
+
    .. versionchanged:: 3.2
       Can be used as a context manager.
 
    .. deprecated:: 3.4
       The ``'rU'`` and ``'U'`` modes.
 
-   .. deprecated-removed:: 3.6 3.8
-      The *bufsize* parameter.
-
    .. deprecated:: 3.8
       Support for :meth:`__getitem__` method is deprecated.
 
+   .. versionchanged:: 3.8
+      The keyword parameter *mode* and *openhook* are now keyword-only.
+
+
 
 **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/whatsnew/3.8.rst b/Doc/whatsnew/3.8.rst
index 0a79b6ce1a65..5f8208d5bf4a 100644
--- a/Doc/whatsnew/3.8.rst
+++ b/Doc/whatsnew/3.8.rst
@@ -828,6 +828,10 @@ The following features and APIs have been removed from Python 3.8:
   exposed to the user.
   (Contributed by Aviv Palivoda in :issue:`30262`.)
 
+* The ``bufsize`` keyword argument of :func:`fileinput.input` and
+  :func:`fileinput.FileInput` which was ignored and deprecated since Python 3.6
+  has been removed. :issue:`36952` (Contributed by Matthias Bussonnier)
+
 
 Porting to Python 3.8
 =====================
diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index 0764aa5e4d24..d868e74cd5e9 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -80,8 +80,7 @@
 
 _state = None
 
-def input(files=None, inplace=False, backup="", bufsize=0,
-          mode="r", openhook=None):
+def input(files=None, inplace=False, backup="", *, mode="r", openhook=None):
     """Return an instance of the FileInput class, which can be iterated.
 
     The parameters are passed to the constructor of the FileInput class.
@@ -91,7 +90,7 @@ def input(files=None, inplace=False, backup="", bufsize=0,
     global _state
     if _state and _state._file:
         raise RuntimeError("input() already active")
-    _state = FileInput(files, inplace, backup, bufsize, mode, openhook)
+    _state = FileInput(files, inplace, backup, mode=mode, openhook=openhook)
     return _state
 
 def close():
@@ -173,7 +172,7 @@ def isstdin():
     return _state.isstdin()
 
 class FileInput:
-    """FileInput([files[, inplace[, backup[, bufsize, [, mode[, openhook]]]]]])
+    """FileInput([files[, inplace[, backup]]], *, mode=None, openhook=None)
 
     Class FileInput is the implementation of the module; its methods
     filename(), lineno(), fileline(), isfirstline(), isstdin(), fileno(),
@@ -185,7 +184,7 @@ class FileInput:
     sequential order; random access and readline() cannot be mixed.
     """
 
-    def __init__(self, files=None, inplace=False, backup="", bufsize=0,
+    def __init__(self, files=None, inplace=False, backup="", *,
                  mode="r", openhook=None):
         if isinstance(files, str):
             files = (files,)
@@ -201,10 +200,6 @@ def __init__(self, files=None, inplace=False, backup="", bufsize=0,
         self._files = files
         self._inplace = inplace
         self._backup = backup
-        if bufsize:
-            import warnings
-            warnings.warn('bufsize is deprecated and ignored',
-                          DeprecationWarning, stacklevel=2)
         self._savestdout = None
         self._output = None
         self._filename = None
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py
index 8b7577b0205c..014f19e6cbdb 100644
--- a/Lib/test/test_fileinput.py
+++ b/Lib/test/test_fileinput.py
@@ -82,25 +82,17 @@ def close(self):
 
 class BufferSizesTests(BaseTests, unittest.TestCase):
     def test_buffer_sizes(self):
-        # First, run the tests with default and teeny buffer size.
-        for round, bs in (0, 0), (1, 30):
-            t1 = self.writeTmp(''.join("Line %s of file 1\n" % (i+1) for i in range(15)))
-            t2 = self.writeTmp(''.join("Line %s of file 2\n" % (i+1) for i in range(10)))
-            t3 = self.writeTmp(''.join("Line %s of file 3\n" % (i+1) for i in range(5)))
-            t4 = self.writeTmp(''.join("Line %s of file 4\n" % (i+1) for i in range(1)))
-            if bs:
-                with self.assertWarns(DeprecationWarning):
-                    self.buffer_size_test(t1, t2, t3, t4, bs, round)
-            else:
-                self.buffer_size_test(t1, t2, t3, t4, bs, round)
-
-    def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0):
+
+        t1 = self.writeTmp(''.join("Line %s of file 1\n" % (i+1) for i in range(15)))
+        t2 = self.writeTmp(''.join("Line %s of file 2\n" % (i+1) for i in range(10)))
+        t3 = self.writeTmp(''.join("Line %s of file 3\n" % (i+1) for i in range(5)))
+        t4 = self.writeTmp(''.join("Line %s of file 4\n" % (i+1) for i in range(1)))
+
         pat = re.compile(r'LINE (\d+) OF FILE (\d+)')
 
-        start = 1 + round*6
         if verbose:
-            print('%s. Simple iteration (bs=%s)' % (start+0, bs))
-        fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs)
+            print('1. Simple iteration')
+        fi = FileInput(files=(t1, t2, t3, t4))
         lines = list(fi)
         fi.close()
         self.assertEqual(len(lines), 31)
@@ -110,8 +102,8 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0):
         self.assertEqual(fi.filename(), t4)
 
         if verbose:
-            print('%s. Status variables (bs=%s)' % (start+1, bs))
-        fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs)
+            print('2. Status variables')
+        fi = FileInput(files=(t1, t2, t3, t4))
         s = "x"
         while s and s != 'Line 6 of file 2\n':
             s = fi.readline()
@@ -122,15 +114,15 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0):
         self.assertFalse(fi.isstdin())
 
         if verbose:
-            print('%s. Nextfile (bs=%s)' % (start+2, bs))
+            print('3. Nextfile')
         fi.nextfile()
         self.assertEqual(fi.readline(), 'Line 1 of file 3\n')
         self.assertEqual(fi.lineno(), 22)
         fi.close()
 
         if verbose:
-            print('%s. Stdin (bs=%s)' % (start+3, bs))
-        fi = FileInput(files=(t1, t2, t3, t4, '-'), bufsize=bs)
+            print('4. Stdin')
+        fi = FileInput(files=(t1, t2, t3, t4, '-'))
         savestdin = sys.stdin
         try:
             sys.stdin = StringIO("Line 1 of stdin\nLine 2 of stdin\n")
@@ -143,8 +135,8 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0):
             sys.stdin = savestdin
 
         if verbose:
-            print('%s. Boundary conditions (bs=%s)' % (start+4, bs))
-        fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs)
+            print('5. Boundary conditions')
+        fi = FileInput(files=(t1, t2, t3, t4))
         self.assertEqual(fi.lineno(), 0)
         self.assertEqual(fi.filename(), None)
         fi.nextfile()
@@ -152,10 +144,10 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0):
         self.assertEqual(fi.filename(), None)
 
         if verbose:
-            print('%s. Inplace (bs=%s)' % (start+5, bs))
+            print('6. Inplace')
         savestdout = sys.stdout
         try:
-            fi = FileInput(files=(t1, t2, t3, t4), inplace=1, bufsize=bs)
+            fi = FileInput(files=(t1, t2, t3, t4), inplace=1)
             for line in fi:
                 line = line[:-1].upper()
                 print(line)
@@ -163,7 +155,7 @@ def buffer_size_test(self, t1, t2, t3, t4, bs=0, round=0):
         finally:
             sys.stdout = savestdout
 
-        fi = FileInput(files=(t1, t2, t3, t4), bufsize=bs)
+        fi = FileInput(files=(t1, t2, t3, t4))
         for line in fi:
             self.assertEqual(line[-1], '\n')
             m = pat.match(line[:-1])
@@ -533,12 +525,11 @@ def test_pathlib_file_inplace(self):
 class MockFileInput:
     """A class that mocks out fileinput.FileInput for use during unit tests"""
 
-    def __init__(self, files=None, inplace=False, backup="", bufsize=0,
+    def __init__(self, files=None, inplace=False, backup="", *,
                  mode="r", openhook=None):
         self.files = files
         self.inplace = inplace
         self.backup = backup
-        self.bufsize = bufsize
         self.mode = mode
         self.openhook = openhook
         self._file = None
@@ -641,13 +632,11 @@ def do_test_call_input(self):
         files = object()
         inplace = object()
         backup = object()
-        bufsize = object()
         mode = object()
         openhook = object()
 
         # call fileinput.input() with different values for each argument
         result = fileinput.input(files=files, inplace=inplace, backup=backup,
-                                 bufsize=bufsize,
             mode=mode, openhook=openhook)
 
         # ensure fileinput._state was set to the returned object
@@ -658,7 +647,6 @@ def do_test_call_input(self):
         self.assertIs(files, result.files, "files")
         self.assertIs(inplace, result.inplace, "inplace")
         self.assertIs(backup, result.backup, "backup")
-        self.assertIs(bufsize, result.bufsize, "bufsize")
         self.assertIs(mode, result.mode, "mode")
         self.assertIs(openhook, result.openhook, "openhook")
 
diff --git a/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst b/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst
new file mode 100644
index 000000000000..f5ce2aadf4a1
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-05-20-11-01-28.bpo-36952.MgZi7-.rst
@@ -0,0 +1,4 @@
+:func:`fileinput.input` and :class:`fileinput.FileInput` **bufsize**
+argument has been removed (was deprecated and ignored since Python 3.6),
+and as a result the **mode** and **openhook** arguments have been made
+keyword-only.



More information about the Python-checkins mailing list