Commit 44309e6b authored by Benjamin Peterson's avatar Benjamin Peterson

make FileIO.mode always include 'b'

#4386 Reviewed by Amaury
parent 656aa28c
...@@ -1875,6 +1875,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: ...@@ -1875,6 +1875,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
view objects. view objects.
.. _dict-views:
Dictionary view objects Dictionary view objects
----------------------- -----------------------
......
...@@ -198,10 +198,12 @@ class SocketIO(io.RawIOBase): ...@@ -198,10 +198,12 @@ class SocketIO(io.RawIOBase):
# XXX More docs # XXX More docs
def __init__(self, sock, mode): def __init__(self, sock, mode):
if mode not in ("r", "w", "rw"): if mode not in ("r", "w", "rw", "rb", "wb", "rwb"):
raise ValueError("invalid mode: %r" % mode) raise ValueError("invalid mode: %r" % mode)
io.RawIOBase.__init__(self) io.RawIOBase.__init__(self)
self._sock = sock self._sock = sock
if "b" not in mode:
mode += "b"
self._mode = mode self._mode = mode
self._reading = "r" in mode self._reading = "r" in mode
self._writing = "w" in mode self._writing = "w" in mode
......
...@@ -49,7 +49,7 @@ class AutoFileTests(unittest.TestCase): ...@@ -49,7 +49,7 @@ class AutoFileTests(unittest.TestCase):
# verify expected attributes exist # verify expected attributes exist
f = self.f f = self.f
self.assertEquals(f.mode, "w") self.assertEquals(f.mode, "wb")
self.assertEquals(f.closed, False) self.assertEquals(f.closed, False)
# verify the attributes are readonly # verify the attributes are readonly
...@@ -159,7 +159,7 @@ class OtherFileTests(unittest.TestCase): ...@@ -159,7 +159,7 @@ class OtherFileTests(unittest.TestCase):
def testModeStrings(self): def testModeStrings(self):
# check invalid mode strings # check invalid mode strings
for mode in ("", "aU", "wU+", "rb", "rt"): for mode in ("", "aU", "wU+", "rw", "rt"):
try: try:
f = _fileio._FileIO(TESTFN, mode) f = _fileio._FileIO(TESTFN, mode)
except ValueError: except ValueError:
......
...@@ -150,7 +150,7 @@ class TestGzip(unittest.TestCase): ...@@ -150,7 +150,7 @@ class TestGzip(unittest.TestCase):
def test_mode(self): def test_mode(self):
self.test_write() self.test_write()
f = gzip.GzipFile(self.filename, 'r') f = gzip.GzipFile(self.filename, 'r')
self.assertTrue(f.myfileobj.mode.startswith('r')) self.assertEqual(f.myfileobj.mode, 'rb')
f.close() f.close()
def test_1647484(self): def test_1647484(self):
......
...@@ -1266,7 +1266,7 @@ class MiscIOTest(unittest.TestCase): ...@@ -1266,7 +1266,7 @@ class MiscIOTest(unittest.TestCase):
def test_attributes(self): def test_attributes(self):
f = io.open(support.TESTFN, "wb", buffering=0) f = io.open(support.TESTFN, "wb", buffering=0)
self.assertEquals(f.mode, "w") self.assertEquals(f.mode, "wb")
f.close() f.close()
f = io.open(support.TESTFN, "U") f = io.open(support.TESTFN, "U")
...@@ -1274,18 +1274,18 @@ class MiscIOTest(unittest.TestCase): ...@@ -1274,18 +1274,18 @@ class MiscIOTest(unittest.TestCase):
self.assertEquals(f.buffer.name, support.TESTFN) self.assertEquals(f.buffer.name, support.TESTFN)
self.assertEquals(f.buffer.raw.name, support.TESTFN) self.assertEquals(f.buffer.raw.name, support.TESTFN)
self.assertEquals(f.mode, "U") self.assertEquals(f.mode, "U")
self.assertEquals(f.buffer.mode, "r") self.assertEquals(f.buffer.mode, "rb")
self.assertEquals(f.buffer.raw.mode, "r") self.assertEquals(f.buffer.raw.mode, "rb")
f.close() f.close()
f = io.open(support.TESTFN, "w+") f = io.open(support.TESTFN, "w+")
self.assertEquals(f.mode, "w+") self.assertEquals(f.mode, "w+")
self.assertEquals(f.buffer.mode, "r+") # Does it really matter? self.assertEquals(f.buffer.mode, "rb+") # Does it really matter?
self.assertEquals(f.buffer.raw.mode, "r+") self.assertEquals(f.buffer.raw.mode, "rb+")
g = io.open(f.fileno(), "wb", closefd=False) g = io.open(f.fileno(), "wb", closefd=False)
self.assertEquals(g.mode, "w") self.assertEquals(g.mode, "wb")
self.assertEquals(g.raw.mode, "w") self.assertEquals(g.raw.mode, "wb")
self.assertEquals(g.name, f.fileno()) self.assertEquals(g.name, f.fileno())
self.assertEquals(g.raw.name, f.fileno()) self.assertEquals(g.raw.name, f.fileno())
f.close() f.close()
......
...@@ -849,11 +849,11 @@ class FileObjectClassTestCase(SocketConnectedTest): ...@@ -849,11 +849,11 @@ class FileObjectClassTestCase(SocketConnectedTest):
self.assert_(not self.cli_file.closed) self.assert_(not self.cli_file.closed)
def testAttributes(self): def testAttributes(self):
self.assertEqual(self.serv_file.mode, 'r') self.assertEqual(self.serv_file.mode, 'rb')
self.assertEqual(self.serv_file.name, self.cli_conn.fileno()) self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
def _testAttributes(self): def _testAttributes(self):
self.assertEqual(self.cli_file.mode, 'w') self.assertEqual(self.cli_file.mode, 'wb')
self.assertEqual(self.cli_file.name, self.serv_conn.fileno()) self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase): class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
......
...@@ -48,6 +48,8 @@ Core and Builtins ...@@ -48,6 +48,8 @@ Core and Builtins
Library Library
------- -------
- FileIO's mode attribute now always includes ``"b"``.
- Issue #3799: Fix dbm.dumb to accept strings as well as bytes for keys. String - Issue #3799: Fix dbm.dumb to accept strings as well as bytes for keys. String
keys are now written out in UTF-8. keys are now written out in UTF-8.
......
...@@ -208,6 +208,8 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) ...@@ -208,6 +208,8 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)
flags |= O_CREAT; flags |= O_CREAT;
append = 1; append = 1;
break; break;
case 'b':
break;
case '+': case '+':
if (plus) if (plus)
goto bad_mode; goto bad_mode;
...@@ -682,12 +684,12 @@ mode_string(PyFileIOObject *self) ...@@ -682,12 +684,12 @@ mode_string(PyFileIOObject *self)
{ {
if (self->readable) { if (self->readable) {
if (self->writable) if (self->writable)
return "r+"; return "rb+";
else else
return "r"; return "rb";
} }
else else
return "w"; return "wb";
} }
static PyObject * static PyObject *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment