]> granicus.if.org Git - python/commitdiff
Issue #15204: Deprecated the 'U' mode in file-like objects.
authorSerhiy Storchaka <storchaka@gmail.com>
Sat, 23 Nov 2013 20:12:06 +0000 (22:12 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sat, 23 Nov 2013 20:12:06 +0000 (22:12 +0200)
13 files changed:
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

index d5a48756fe86e5fb09be2ae736820e9ff9e08aff..ee06830ad8e7640d22ff9fd8b1c7866d54cbf4e1 100644 (file)
@@ -160,6 +160,9 @@ available for subclassing as well:
    .. 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
index ffee09efce936859d986cfea6424961c0fa9be80..474bb1dfa022bbdb6cc7295e66a7f978cc00f09c 100644 (file)
@@ -872,8 +872,7 @@ are always available.  They are listed here in alphabetical order.
    ``'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 @@ are always available.  They are listed here in alphabetical order.
    .. 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)
index 72b76a09d396323e06b6e35f46941fa4cc98be7d..1966713ed00ec062e4d166b4ca0898152213f361 100644 (file)
@@ -234,6 +234,9 @@ ZipFile Objects
       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)
 
index 78c6dfb4cd846b34dd40685f9d20881e5c97cb85..d6eee79e016b3c28c21100e6566682fcb82ccf05 100644 (file)
@@ -62,8 +62,7 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
     '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 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
     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 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None,
     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")
index 3215154e88d9de9588919e4789fdbe0dcb8e52d2..11ba82df875ac1c2fc20073dda3a00c464111b65 100644 (file)
@@ -222,6 +222,10 @@ class FileInput:
         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:
index 1144cd1f64cd5957ba42fef053d9e73c8019678e..c8449c615549659975e24dcf193b37674191c682 100644 (file)
@@ -103,7 +103,7 @@ def source_from_cache(path):
 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 @@ def find_module(name, path=None):
         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)
index cf27a712d515fbf11a6c7a5ddde33da0214b6833..78f573407c7507627ba8a08cf8853de743b19546 100644 (file)
@@ -165,7 +165,7 @@ class ImportTests(unittest.TestCase):
                 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)
index ae65b42f70f9f7d2395892ed00f865ff30498190..fad52a246d5a194f91939bde3c17826760a827dc 100644 (file)
@@ -1117,6 +1117,10 @@ class ZipFile:
         """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:
index 9cfecb5564cde914ac488a2a58047784553dff32..5185efef3f8f64072c2baf023e8984709a0b16a7 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -68,6 +68,8 @@ Core and Builtins
 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.
index eb701d4400fff1cd7c993cf7a4c7596eea3ffde2..9866fbe82be949912921fc0a83152a4079e2250e 100644 (file)
@@ -126,8 +126,7 @@ PyDoc_STRVAR(open_doc,
 "'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 @@ PyDoc_STRVAR(open_doc,
 "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 @@ io_open(PyObject *self, PyObject *args, PyObject *kwds)
                             "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;
     }
 
index 530bc79d5c819a482fc3b4732068b3bff9f997f6..712e58472ed96016e3f4d134bcce0db6873a0978 100644 (file)
@@ -24,6 +24,8 @@ def text_open(fn, mode, encoding=None):
     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 @@ def prepare_files():
             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("# <iobench text chunk marker>"):
                 break
index f9b14bf5e51e4a9b7853fc04072114b12f59f630..8be527fd627694314b07b88316154812f3e5af41 100755 (executable)
@@ -38,9 +38,9 @@ def main():
 
     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:
index 2422091dccbc86e8e2d785a1dec52c4deaade416..c6d09b8f242fef1a38e719e31927d7e136110ba0 100755 (executable)
@@ -60,7 +60,7 @@ def fail(msg):
 # 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))