[Python-checkins] cpython: - Issue #2091: error correctly on open() with mode 'U' and '+'

robert.collins python-checkins at python.org
Sat Jul 25 20:43:31 CEST 2015


https://hg.python.org/cpython/rev/1a5bbb31f740
changeset:   97066:1a5bbb31f740
parent:      97064:8f65be73eb3a
user:        Robert Collins <rbtcollins at hp.com>
date:        Sun Jul 26 06:43:13 2015 +1200
summary:
  - Issue #2091: error correctly on open() with mode 'U' and '+'

open() accepted a 'U' mode string containing '+', but 'U' can only be used with
'r'. Patch from Jeff Balogh and John O'Connor.

files:
  Lib/_pyio.py            |   4 ++--
  Lib/test/test_file.py   |   2 +-
  Misc/NEWS               |   3 +++
  Modules/_io/_iomodule.c |  16 ++++++++--------
  4 files changed, 14 insertions(+), 11 deletions(-)


diff --git a/Lib/_pyio.py b/Lib/_pyio.py
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -181,8 +181,8 @@
     text = "t" in modes
     binary = "b" in modes
     if "U" in modes:
-        if creating or writing or appending:
-            raise ValueError("can't use U and writing mode at once")
+        if creating or writing or appending or updating:
+            raise ValueError("mode U cannot be combined with 'x', 'w', 'a', or '+'")
         import warnings
         warnings.warn("'U' mode is deprecated",
                       DeprecationWarning, 2)
diff --git a/Lib/test/test_file.py b/Lib/test/test_file.py
--- a/Lib/test/test_file.py
+++ b/Lib/test/test_file.py
@@ -139,7 +139,7 @@
 
     def testModeStrings(self):
         # check invalid mode strings
-        for mode in ("", "aU", "wU+"):
+        for mode in ("", "aU", "wU+", "U+", "+U", "rU+"):
             try:
                 f = self.open(TESTFN, mode)
             except ValueError:
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -15,6 +15,9 @@
 
 - Issue #13938: 2to3 converts StringTypes to a tuple. Patch from Mark Hammond.
 
+- Issue #2091: open() accepted a 'U' mode string containing '+', but 'U' can
+  only be used with 'r'. Patch from Jeff Balogh and John O'Connor.
+
 - Issue #8585: improved tests for zipimporter2. Patch from Mark Lawrence.
 
 - Issue #18622: unittest.mock.mock_open().reset_mock would recurse infinitely.
diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c
--- a/Modules/_io/_iomodule.c
+++ b/Modules/_io/_iomodule.c
@@ -248,8 +248,8 @@
     _Py_IDENTIFIER(close);
 
     if (!PyUnicode_Check(file) &&
-	!PyBytes_Check(file) &&
-	!PyNumber_Check(file)) {
+        !PyBytes_Check(file) &&
+        !PyNumber_Check(file)) {
         PyErr_Format(PyExc_TypeError, "invalid file: %R", file);
         return NULL;
     }
@@ -307,9 +307,9 @@
 
     /* Parameters validation */
     if (universal) {
-        if (writing || appending) {
+        if (creating || writing || appending || updating) {
             PyErr_SetString(PyExc_ValueError,
-                            "can't use U and writing mode at once");
+                            "mode U cannot be combined with x', 'w', 'a', or '+'");
             return NULL;
         }
         if (PyErr_WarnEx(PyExc_DeprecationWarning,
@@ -437,10 +437,10 @@
 
     /* wraps into a TextIOWrapper */
     wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type,
-				    "Osssi",
-				    buffer,
-				    encoding, errors, newline,
-				    line_buffering);
+                                    "Osssi",
+                                    buffer,
+                                    encoding, errors, newline,
+                                    line_buffering);
     if (wrapper == NULL)
         goto error;
     result = wrapper;

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list