]> granicus.if.org Git - python/commitdiff
Merged revisions 87427 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 21 Dec 2010 21:26:09 +0000 (21:26 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 21 Dec 2010 21:26:09 +0000 (21:26 +0000)
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r87427 | antoine.pitrou | 2010-12-21 22:20:59 +0100 (mar., 21 déc. 2010) | 3 lines

  Issue #10750: The `raw` attribute of buffered IO objects is now read-only.
........

Lib/_pyio.py
Lib/test/test_io.py
Misc/NEWS
Modules/_io/bufferedio.c

index 4485233b9a32da0692e4c98e54f3bf8a9af85a64..b350bd437343198ccebbb374e907cdf8cfa33ebb 100644 (file)
@@ -674,7 +674,7 @@ class _BufferedIOMixin(BufferedIOBase):
     """
 
     def __init__(self, raw):
-        self.raw = raw
+        self._raw = raw
 
     ### Positioning ###
 
@@ -718,8 +718,8 @@ class _BufferedIOMixin(BufferedIOBase):
         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 ###
@@ -733,6 +733,10 @@ class _BufferedIOMixin(BufferedIOBase):
     def writable(self):
         return self.raw.writable()
 
+    @property
+    def raw(self):
+        return self._raw
+
     @property
     def closed(self):
         return self.raw.closed
@@ -1444,7 +1448,7 @@ class TextIOWrapper(TextIOBase):
             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
@@ -1499,6 +1503,10 @@ class TextIOWrapper(TextIOBase):
     def line_buffering(self):
         return self._line_buffering
 
+    @property
+    def buffer(self):
+        return self._buffer
+
     def seekable(self):
         return self._seekable
 
@@ -1713,8 +1721,8 @@ class TextIOWrapper(TextIOBase):
         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 ab8479d3a69ab8149659a8004d45c8ef6af83c6f..5f62494e63ca41bcccdd22208668f37e74816c27 100644 (file)
@@ -693,6 +693,13 @@ class CommonBufferedTests:
         b.close()
         self.assertRaises(ValueError, b.flush)
 
+    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"
@@ -2210,6 +2217,12 @@ class TextIOWrapperTest(unittest.TestCase):
         txt.close()
         self.assertRaises(ValueError, txt.flush)
 
+    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 0ff81decb7f3de51933e890e7f5cc6c6bd107cc0..6a216edc890c46127cb637dbe915cee5e2613943 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #10750: The ``raw`` attribute of buffered IO objects is now read-only.
+
 - Issue #6791: Limit header line length (to 65535 bytes) in http.client
   and http.server, to avoid denial of services from the other party.
 
index 11bc0b6f8ca9e23cd717badc42d1b92c50915127..71c4052f29c03c32e3c130f0ece4c9b0bdbadb55 100644 (file)
@@ -1500,7 +1500,7 @@ static PyMethodDef bufferedreader_methods[] = {
 };
 
 static PyMemberDef bufferedreader_members[] = {
-    {"raw", T_OBJECT, offsetof(buffered, raw), 0},
+    {"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
     {NULL}
 };
 
@@ -1882,7 +1882,7 @@ static PyMethodDef bufferedwriter_methods[] = {
 };
 
 static PyMemberDef bufferedwriter_members[] = {
-    {"raw", T_OBJECT, offsetof(buffered, raw), 0},
+    {"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
     {NULL}
 };
 
@@ -2272,7 +2272,7 @@ static PyMethodDef bufferedrandom_methods[] = {
 };
 
 static PyMemberDef bufferedrandom_members[] = {
-    {"raw", T_OBJECT, offsetof(buffered, raw), 0},
+    {"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
     {NULL}
 };