Index: Lib/test/test_fileio.py =================================================================== --- Lib/test/test_fileio.py (revision 81462) +++ Lib/test/test_fileio.py (working copy) @@ -80,6 +80,9 @@ self.assertEqual(self.f.readline(None), b"hi\n") self.assertEqual(self.f.readlines(None), [b"bye\n", b"abc"]) + def testWriteUnicode(self): + self.assertRaises(TypeError, self.f.write, '') + def testRepr(self): self.assertEquals(repr(self.f), "<_io.FileIO name=%r mode='%s'>" % (self.f.name, self.f.mode)) @@ -172,7 +175,7 @@ @ClosedFDRaises def testErrnoOnClosedWrite(self, f): - f.write('a') + f.write(b'a') @ClosedFDRaises def testErrnoOnClosedSeek(self, f): Index: Modules/_io/fileio.c =================================================================== --- Modules/_io/fileio.c (revision 81462) +++ Modules/_io/fileio.c (working copy) @@ -648,12 +648,20 @@ { Py_buffer pbuf; Py_ssize_t n; + PyObject *obj; if (self->fd < 0) return err_closed(); if (!self->writable) return err_mode("writing"); + if (!PyArg_ParseTuple(args, "O", &obj)) + return NULL; + if (PyUnicode_Check(obj)){ + PyErr_SetString(PyExc_TypeError, "must not be unicode!"); + return NULL; + } + if (!PyArg_ParseTuple(args, "s*", &pbuf)) return NULL; Index: Modules/_io/bufferedio.c =================================================================== --- Modules/_io/bufferedio.c (revision 81462) +++ Modules/_io/bufferedio.c (working copy) @@ -1693,8 +1693,16 @@ Py_buffer buf; Py_ssize_t written, avail, remaining; Py_off_t offset; + PyObject *obj; CHECK_INITIALIZED(self) + if (!PyArg_ParseTuple(args, "O", &obj)) + return NULL; + if (PyUnicode_Check(obj)){ + PyErr_SetString(PyExc_TypeError, "must not be unicode!"); + return NULL; + } + if (!PyArg_ParseTuple(args, "s*:write", &buf)) { return NULL; }