Skip to content

Commit

Permalink
Issue python#15204: Deprecated the 'U' mode in file-like objects.
Browse files Browse the repository at this point in the history
  • Loading branch information
serhiy-storchaka committed Nov 23, 2013
1 parent d41c343 commit 6787a38
Show file tree
Hide file tree
Showing 13 changed files with 45 additions and 13 deletions.
3 changes: 3 additions & 0 deletions Doc/library/fileinput.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions Doc/library/functions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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'``).
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions Doc/library/zipfile.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
10 changes: 8 additions & 2 deletions Lib/_pyio.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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")
Expand Down
4 changes: 4 additions & 0 deletions Lib/fileinput.py
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,10 @@ def __init__(self, files=None, inplace=False, backup="", bufsize=0,
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:
Expand Down
4 changes: 2 additions & 2 deletions Lib/imp.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_imp.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ def test_issue5604(self):
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)
Expand Down
4 changes: 4 additions & 0 deletions Lib/zipfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,10 @@ def open(self, name, mode="r", pwd=None):
"""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:
Expand Down
2 changes: 2 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 8 additions & 2 deletions Modules/_io/_iomodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -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;
}

Expand Down
4 changes: 3 additions & 1 deletion Tools/iobench/iobench.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions Tools/scripts/diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion Tools/scripts/ndiff.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down

0 comments on commit 6787a38

Please sign in to comment.