Index: Lib/socket.py =================================================================== --- Lib/socket.py (revision 67322) +++ Lib/socket.py (working copy) @@ -198,10 +198,12 @@ # XXX More docs 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) io.RawIOBase.__init__(self) self._sock = sock + if "b" not in mode: + mode += "b" self._mode = mode self._reading = "r" in mode self._writing = "w" in mode Index: Lib/test/test_io.py =================================================================== --- Lib/test/test_io.py (revision 67322) +++ Lib/test/test_io.py (working copy) @@ -1266,7 +1266,7 @@ def test_attributes(self): f = io.open(support.TESTFN, "wb", buffering=0) - self.assertEquals(f.mode, "w") + self.assertEquals(f.mode, "wb") f.close() f = io.open(support.TESTFN, "U") @@ -1274,18 +1274,18 @@ self.assertEquals(f.buffer.name, support.TESTFN) self.assertEquals(f.buffer.raw.name, support.TESTFN) self.assertEquals(f.mode, "U") - self.assertEquals(f.buffer.mode, "r") - self.assertEquals(f.buffer.raw.mode, "r") + self.assertEquals(f.buffer.mode, "rb") + self.assertEquals(f.buffer.raw.mode, "rb") f.close() f = io.open(support.TESTFN, "w+") self.assertEquals(f.mode, "w+") - self.assertEquals(f.buffer.mode, "r+") # Does it really matter? - self.assertEquals(f.buffer.raw.mode, "r+") + self.assertEquals(f.buffer.mode, "rb+") # Does it really matter? + self.assertEquals(f.buffer.raw.mode, "rb+") g = io.open(f.fileno(), "wb", closefd=False) - self.assertEquals(g.mode, "w") - self.assertEquals(g.raw.mode, "w") + self.assertEquals(g.mode, "wb") + self.assertEquals(g.raw.mode, "wb") self.assertEquals(g.name, f.fileno()) self.assertEquals(g.raw.name, f.fileno()) f.close() Index: Lib/test/test_socket.py =================================================================== --- Lib/test/test_socket.py (revision 67322) +++ Lib/test/test_socket.py (working copy) @@ -849,11 +849,11 @@ self.assert_(not self.cli_file.closed) 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()) 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()) class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase): Index: Lib/test/test_gzip.py =================================================================== --- Lib/test/test_gzip.py (revision 67322) +++ Lib/test/test_gzip.py (working copy) @@ -150,7 +150,7 @@ def test_mode(self): self.test_write() f = gzip.GzipFile(self.filename, 'r') - self.assertTrue(f.myfileobj.mode.startswith('r')) + self.assertEqual(f.myfileobj.mode, 'rb') f.close() def test_1647484(self): Index: Lib/test/test_fileio.py =================================================================== --- Lib/test/test_fileio.py (revision 67322) +++ Lib/test/test_fileio.py (working copy) @@ -49,7 +49,7 @@ # verify expected attributes exist f = self.f - self.assertEquals(f.mode, "w") + self.assertEquals(f.mode, "wb") self.assertEquals(f.closed, False) # verify the attributes are readonly @@ -159,7 +159,7 @@ def testModeStrings(self): # check invalid mode strings - for mode in ("", "aU", "wU+", "rb", "rt"): + for mode in ("", "aU", "wU+", "rw", "rt"): try: f = _fileio._FileIO(TESTFN, mode) except ValueError: Index: Modules/_fileio.c =================================================================== --- Modules/_fileio.c (revision 67322) +++ Modules/_fileio.c (working copy) @@ -208,6 +208,8 @@ flags |= O_CREAT; append = 1; break; + case 'b': + break; case '+': if (plus) goto bad_mode; @@ -682,12 +684,12 @@ { if (self->readable) { if (self->writable) - return "r+"; + return "rb+"; else - return "r"; + return "rb"; } else - return "w"; + return "wb"; } static PyObject *