diff options
| -rw-r--r-- | Lib/_pyio.py | 4 | ||||
| -rw-r--r-- | Lib/test/test_file.py | 2 | ||||
| -rw-r--r-- | Misc/NEWS | 3 | ||||
| -rw-r--r-- | Modules/_io/_iomodule.c | 16 | 
4 files changed, 14 insertions, 11 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 50ad9ff..33d8a3f 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -181,8 +181,8 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,      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 index d54e976..94f189a 100644 --- a/Lib/test/test_file.py +++ b/Lib/test/test_file.py @@ -139,7 +139,7 @@ class OtherFileTests:      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: @@ -15,6 +15,9 @@ Library  - 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 index 528bcd4..1c2d3a0 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -248,8 +248,8 @@ _io_open_impl(PyModuleDef *module, PyObject *file, const char *mode,      _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 @@ _io_open_impl(PyModuleDef *module, PyObject *file, const char *mode,      /* 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 @@ _io_open_impl(PyModuleDef *module, PyObject *file, const char *mode,      /* 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;  | 
