(original) (raw)
changeset: 87448:70bd6f7e013b parent: 87443:80f48fbb25b8 user: Serhiy Storchaka storchaka@gmail.com date: Sat Nov 23 22:12:06 2013 +0200 files: Doc/library/fileinput.rst Doc/library/functions.rst Doc/library/zipfile.rst Lib/_pyio.py Lib/fileinput.py Lib/imp.py Lib/test/test_imp.py Lib/zipfile.py Misc/NEWS Modules/_io/_iomodule.c Tools/iobench/iobench.py Tools/scripts/diff.py Tools/scripts/ndiff.py description: Issue #15204: Deprecated the 'U' mode in file-like objects. diff -r 80f48fbb25b8 -r 70bd6f7e013b Doc/library/fileinput.rst --- a/Doc/library/fileinput.rst Sat Nov 23 11:51:53 2013 -0800 +++ b/Doc/library/fileinput.rst Sat Nov 23 22:12:06 2013 +0200 @@ -160,6 +160,9 @@ .. versionchanged:: 3.2 Can be used as a context manager. + .. deprecated:: 3.4 + The ``'rU'`` and ``'U'`` modes. + **Optional in-place filtering:** if the keyword argument ``inplace=True`` is passed to :func:`fileinput.input` or to the :class:`FileInput` constructor, the diff -r 80f48fbb25b8 -r 70bd6f7e013b Doc/library/functions.rst --- a/Doc/library/functions.rst Sat Nov 23 11:51:53 2013 -0800 +++ b/Doc/library/functions.rst Sat Nov 23 22:12:06 2013 +0200 @@ -872,8 +872,7 @@ ``'b'`` binary mode ``'t'`` text mode (default) ``'+'`` open a disk file for updating (reading and writing) - ``'U'`` universal newlines mode (for backwards compatibility; should - not be used in new code) + ``'U'`` :term:`universal newlines` mode (deprecated) ========= =============================================================== The default mode is ``'r'`` (open for reading text, synonym of ``'rt'``). @@ -1029,6 +1028,9 @@ .. versionchanged:: 3.4 The file is now non-inheritable. + .. deprecated-removed:: 3.4 4.0 + The ``'U'`` mode. + .. XXX works for bytes too, but should it? .. function:: ord(c) diff -r 80f48fbb25b8 -r 70bd6f7e013b Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst Sat Nov 23 11:51:53 2013 -0800 +++ b/Doc/library/zipfile.rst Sat Nov 23 22:12:06 2013 +0200 @@ -234,6 +234,9 @@ or a :class:`ZipInfo` object. You will appreciate this when trying to read a ZIP file that contains members with duplicate names. + .. deprecated-removed:: 3.4 3.6 + The ``'U'`` or ``'rU'`` mode. Use :class:`io.TextIOWrapper` for reading + compressed text files in :term:`universal newlines` mode. .. method:: ZipFile.extract(member, path=None, pwd=None) diff -r 80f48fbb25b8 -r 70bd6f7e013b Lib/_pyio.py --- a/Lib/_pyio.py Sat Nov 23 11:51:53 2013 -0800 +++ b/Lib/_pyio.py Sat Nov 23 22:12:06 2013 +0200 @@ -62,8 +62,7 @@ 'b' binary mode 't' text mode (default) '+' open a disk file for updating (reading and writing) - 'U' universal newline mode (for backwards compatibility; unneeded - for new code) + 'U' universal newline mode (deprecated) ========= =============================================================== The default mode is 'rt' (open for reading text). For binary random @@ -79,6 +78,10 @@ returned as strings, the bytes having been first decoded using a platform-dependent encoding or using the specified encoding if given. + 'U' mode is deprecated and will raise an exception in future versions + of Python. It has no effect in Python 3. Use newline to control + universal newlines mode. + buffering is an optional integer used to set the buffering policy. Pass 0 to switch buffering off (only allowed in binary mode), 1 to select line buffering (only usable in text mode), and an integer > 1 to indicate @@ -174,6 +177,9 @@ if "U" in modes: if creating or writing or appending: raise ValueError("can't use U and writing mode at once") + import warnings + warnings.warn("'U' mode is deprecated", + DeprecationWarning, 2) reading = True if text and binary: raise ValueError("can't have text and binary mode at once") diff -r 80f48fbb25b8 -r 70bd6f7e013b Lib/fileinput.py --- a/Lib/fileinput.py Sat Nov 23 11:51:53 2013 -0800 +++ b/Lib/fileinput.py Sat Nov 23 22:12:06 2013 +0200 @@ -222,6 +222,10 @@ if mode not in ('r', 'rU', 'U', 'rb'): raise ValueError("FileInput opening mode must be one of " "'r', 'rU', 'U' and 'rb'") + if 'U' in mode: + import warnings + warnings.warn("Use of 'U' mode is deprecated", + DeprecationWarning, 2) self._mode = mode if openhook: if inplace: diff -r 80f48fbb25b8 -r 70bd6f7e013b Lib/imp.py --- a/Lib/imp.py Sat Nov 23 11:51:53 2013 -0800 +++ b/Lib/imp.py Sat Nov 23 22:12:06 2013 +0200 @@ -103,7 +103,7 @@ def get_suffixes(): """**DEPRECATED**""" extensions = [(s, 'rb', C_EXTENSION) for s in machinery.EXTENSION_SUFFIXES] - source = [(s, 'U', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES] + source = [(s, 'r', PY_SOURCE) for s in machinery.SOURCE_SUFFIXES] bytecode = [(s, 'rb', PY_COMPILED) for s in machinery.BYTECODE_SUFFIXES] return extensions + source + bytecode @@ -297,7 +297,7 @@ raise ImportError(_ERR_MSG.format(name), name=name) encoding = None - if mode == 'U': + if 'b' not in mode: with open(file_path, 'rb') as file: encoding = tokenize.detect_encoding(file.readline)[0] file = open(file_path, mode, encoding=encoding) diff -r 80f48fbb25b8 -r 70bd6f7e013b Lib/test/test_imp.py --- a/Lib/test/test_imp.py Sat Nov 23 11:51:53 2013 -0800 +++ b/Lib/test/test_imp.py Sat Nov 23 22:12:06 2013 +0200 @@ -165,7 +165,7 @@ self.assertIsNotNone(file) self.assertTrue(filename[:-3].endswith(temp_mod_name)) self.assertEqual(info[0], '.py') - self.assertEqual(info[1], 'U') + self.assertEqual(info[1], 'r') self.assertEqual(info[2], imp.PY_SOURCE) mod = imp.load_module(temp_mod_name, file, filename, info) diff -r 80f48fbb25b8 -r 70bd6f7e013b Lib/zipfile.py --- a/Lib/zipfile.py Sat Nov 23 11:51:53 2013 -0800 +++ b/Lib/zipfile.py Sat Nov 23 22:12:06 2013 +0200 @@ -1117,6 +1117,10 @@ """Return file-like object for 'name'.""" if mode not in ("r", "U", "rU"): raise RuntimeError('open() requires mode "r", "U", or "rU"') + if 'U' in mode: + import warnings + warnings.warn("'U' mode is deprecated", + DeprecationWarning, 2) if pwd and not isinstance(pwd, bytes): raise TypeError("pwd: expected bytes, got %s" % type(pwd)) if not self.fp: diff -r 80f48fbb25b8 -r 70bd6f7e013b Misc/NEWS --- a/Misc/NEWS Sat Nov 23 11:51:53 2013 -0800 +++ b/Misc/NEWS Sat Nov 23 22:12:06 2013 +0200 @@ -68,6 +68,8 @@ Library ------- +- Issue #15204: Deprecated the 'U' mode in file-like objects. + - Issue #17810: Implement PEP 3154, pickle protocol 4. - Issue #19668: Added support for the cp1125 encoding. diff -r 80f48fbb25b8 -r 70bd6f7e013b Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c Sat Nov 23 11:51:53 2013 -0800 +++ b/Modules/_io/_iomodule.c Sat Nov 23 22:12:06 2013 +0200 @@ -126,8 +126,7 @@ "'b' binary mode\n" "'t' text mode (default)\n" "'+' open a disk file for updating (reading and writing)\n" -"'U' universal newline mode (for backwards compatibility; unneeded\n" -" for new code)\n" +"'U' universal newline mode (deprecated)\n" "========= ===============================================================\n" "\n" "The default mode is 'rt' (open for reading text). For binary random\n" @@ -143,6 +142,10 @@ "returned as strings, the bytes having been first decoded using a\n" "platform-dependent encoding or using the specified encoding if given.\n" "\n" +"'U' mode is deprecated and will raise an exception in future versions\n" +"of Python. It has no effect in Python 3. Use newline to control\n" +"universal newlines mode.\n" +"\n" "buffering is an optional integer used to set the buffering policy.\n" "Pass 0 to switch buffering off (only allowed in binary mode), 1 to select\n" "line buffering (only usable in text mode), and an integer > 1 to indicate\n" @@ -310,6 +313,9 @@ "can't use U and writing mode at once"); return NULL; } + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "'U' mode is deprecated", 1) < 0) + return NULL; reading = 1; } diff -r 80f48fbb25b8 -r 70bd6f7e013b Tools/iobench/iobench.py --- a/Tools/iobench/iobench.py Sat Nov 23 11:51:53 2013 -0800 +++ b/Tools/iobench/iobench.py Sat Nov 23 22:12:06 2013 +0200 @@ -24,6 +24,8 @@ try: return open(fn, mode, encoding=encoding or TEXT_ENCODING) except TypeError: + if 'r' in mode: + mode += 'U' # 'U' mode is needed only in Python 2.x return open(fn, mode) def get_file_sizes(): @@ -380,7 +382,7 @@ f.write(os.urandom(size)) # Text files chunk = [] - with text_open(__file__, "rU", encoding='utf8') as f: + with text_open(__file__, "r", encoding='utf8') as f: for line in f: if line.startswith("# "): break diff -r 80f48fbb25b8 -r 70bd6f7e013b Tools/scripts/diff.py --- a/Tools/scripts/diff.py Sat Nov 23 11:51:53 2013 -0800 +++ b/Tools/scripts/diff.py Sat Nov 23 22:12:06 2013 +0200 @@ -38,9 +38,9 @@ fromdate = file_mtime(fromfile) todate = file_mtime(tofile) - with open(fromfile, 'U') as ff: + with open(fromfile) as ff: fromlines = ff.readlines() - with open(tofile, 'U') as tf: + with open(tofile) as tf: tolines = tf.readlines() if options.u: diff -r 80f48fbb25b8 -r 70bd6f7e013b Tools/scripts/ndiff.py --- a/Tools/scripts/ndiff.py Sat Nov 23 11:51:53 2013 -0800 +++ b/Tools/scripts/ndiff.py Sat Nov 23 22:12:06 2013 +0200 @@ -60,7 +60,7 @@ # couldn't be opened def fopen(fname): try: - return open(fname, 'U') + return open(fname) except IOError as detail: return fail("couldn't open " + fname + ": " + str(detail))/storchaka@gmail.com