Index: Lib/_pyio.py =================================================================== --- Lib/_pyio.py (révision 87425) +++ Lib/_pyio.py (copie de travail) @@ -676,7 +676,7 @@ """ def __init__(self, raw): - self.raw = raw + self._raw = raw ### Positioning ### @@ -720,8 +720,8 @@ if self.raw is None: raise ValueError("raw stream already detached") self.flush() - raw = self.raw - self.raw = None + raw = self._raw + self._raw = None return raw ### Inquiries ### @@ -736,6 +736,10 @@ return self.raw.writable() @property + def raw(self): + return self._raw + + @property def closed(self): return self.raw.closed @@ -1465,7 +1469,7 @@ if not isinstance(errors, str): raise ValueError("invalid errors: %r" % errors) - self.buffer = buffer + self._buffer = buffer self._line_buffering = line_buffering self._encoding = encoding self._errors = errors @@ -1520,6 +1524,10 @@ def line_buffering(self): return self._line_buffering + @property + def buffer(self): + return self._buffer + def seekable(self): return self._seekable @@ -1734,8 +1742,8 @@ if self.buffer is None: raise ValueError("buffer is already detached") self.flush() - buffer = self.buffer - self.buffer = None + buffer = self._buffer + self._buffer = None return buffer def seek(self, cookie, whence=0): Index: Lib/test/test_io.py =================================================================== --- Lib/test/test_io.py (révision 87425) +++ Lib/test/test_io.py (copie de travail) @@ -730,7 +730,14 @@ self.assertRaises(self.UnsupportedOperation, bufio.tell) self.assertRaises(self.UnsupportedOperation, bufio.seek, 0) + def test_readonly_attributes(self): + raw = self.MockRawIO() + buf = self.tp(raw) + x = self.MockRawIO() + with self.assertRaises(AttributeError): + buf.raw = x + class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): read_mode = "rb" @@ -2245,6 +2252,12 @@ self.assertRaises(self.UnsupportedOperation, txt.tell) self.assertRaises(self.UnsupportedOperation, txt.seek, 0) + def test_readonly_attributes(self): + txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii") + buf = self.BytesIO(self.testdata) + with self.assertRaises(AttributeError): + txt.buffer = buf + class CTextIOWrapperTest(TextIOWrapperTest): def test_initialization(self): Index: Modules/_io/bufferedio.c =================================================================== --- Modules/_io/bufferedio.c (révision 87425) +++ Modules/_io/bufferedio.c (copie de travail) @@ -1541,7 +1541,7 @@ }; static PyMemberDef bufferedreader_members[] = { - {"raw", T_OBJECT, offsetof(buffered, raw), 0}, + {"raw", T_OBJECT, offsetof(buffered, raw), READONLY}, {NULL} }; @@ -1926,7 +1926,7 @@ }; static PyMemberDef bufferedwriter_members[] = { - {"raw", T_OBJECT, offsetof(buffered, raw), 0}, + {"raw", T_OBJECT, offsetof(buffered, raw), READONLY}, {NULL} }; @@ -2320,7 +2320,7 @@ }; static PyMemberDef bufferedrandom_members[] = { - {"raw", T_OBJECT, offsetof(buffered, raw), 0}, + {"raw", T_OBJECT, offsetof(buffered, raw), READONLY}, {NULL} };