[Python-checkins] bpo-1613500: Don't hardcode output file mode in fileinput.FileInput (GH-12986)

Berker Peksag webhook-mailer at python.org
Mon Apr 29 10:56:00 EDT 2019


https://github.com/python/cpython/commit/be6dbfb43b89989ccc83fbc4c5234f50f44c47ad
commit: be6dbfb43b89989ccc83fbc4c5234f50f44c47ad
branch: master
author: Berker Peksag <berker.peksag at gmail.com>
committer: GitHub <noreply at github.com>
date: 2019-04-29T17:55:39+03:00
summary:

bpo-1613500: Don't hardcode output file mode in fileinput.FileInput (GH-12986)

files:
A Misc/NEWS.d/next/Library/2019-04-27-21-09-33.bpo-1613500.Ogp4P0.rst
M Lib/fileinput.py
M Lib/test/test_fileinput.py

diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index 4a71cc5ff318..0764aa5e4d24 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -222,6 +222,7 @@ def __init__(self, files=None, inplace=False, backup="", bufsize=0,
             warnings.warn("'U' mode is deprecated",
                           DeprecationWarning, 2)
         self._mode = mode
+        self._write_mode = mode.replace('r', 'w') if 'U' not in mode else 'w'
         if openhook:
             if inplace:
                 raise ValueError("FileInput cannot use an opening hook in inplace mode")
@@ -348,14 +349,14 @@ def _readline(self):
                 try:
                     perm = os.fstat(self._file.fileno()).st_mode
                 except OSError:
-                    self._output = open(self._filename, "w")
+                    self._output = open(self._filename, self._write_mode)
                 else:
                     mode = os.O_CREAT | os.O_WRONLY | os.O_TRUNC
                     if hasattr(os, 'O_BINARY'):
                         mode |= os.O_BINARY
 
                     fd = os.open(self._filename, mode, perm)
-                    self._output = os.fdopen(fd, "w")
+                    self._output = os.fdopen(fd, self._write_mode)
                     try:
                         os.chmod(self._filename, perm)
                     except OSError:
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py
index 3857401ca60f..8b7577b0205c 100644
--- a/Lib/test/test_fileinput.py
+++ b/Lib/test/test_fileinput.py
@@ -329,6 +329,16 @@ def test_readline_binary_mode(self):
             self.assertEqual(fi.readline(), b'')
             self.assertEqual(fi.readline(), b'')
 
+    def test_inplace_binary_write_mode(self):
+        temp_file = self.writeTmp(b'Initial text.', mode='wb')
+        with FileInput(temp_file, mode='rb', inplace=True) as fobj:
+            line = fobj.readline()
+            self.assertEqual(line, b'Initial text.')
+            # print() cannot be used with files opened in binary mode.
+            sys.stdout.write(b'New line.')
+        with open(temp_file, 'rb') as f:
+            self.assertEqual(f.read(), b'New line.')
+
     def test_context_manager(self):
         t1 = self.writeTmp("A\nB\nC")
         t2 = self.writeTmp("D\nE\nF")
diff --git a/Misc/NEWS.d/next/Library/2019-04-27-21-09-33.bpo-1613500.Ogp4P0.rst b/Misc/NEWS.d/next/Library/2019-04-27-21-09-33.bpo-1613500.Ogp4P0.rst
new file mode 100644
index 000000000000..4501819ac360
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-04-27-21-09-33.bpo-1613500.Ogp4P0.rst
@@ -0,0 +1,3 @@
+:class:`fileinput.FileInput` now uses the input file mode to correctly set
+the output file mode (previously it was hardcoded to ``'w'``)  when
+``inplace=True`` is passed to its constructor.



More information about the Python-checkins mailing list