Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6cfc512

Browse files
committed
Merged revisions 87427 via svnmerge from
svn+ssh://[email protected]/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. ........
1 parent 9fc6b6c commit 6cfc512

4 files changed

Lines changed: 32 additions & 9 deletions

File tree

Lib/_pyio.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ class _BufferedIOMixin(BufferedIOBase):
674674
"""
675675

676676
def __init__(self, raw):
677-
self.raw = raw
677+
self._raw = raw
678678

679679
### Positioning ###
680680

@@ -718,8 +718,8 @@ def detach(self):
718718
if self.raw is None:
719719
raise ValueError("raw stream already detached")
720720
self.flush()
721-
raw = self.raw
722-
self.raw = None
721+
raw = self._raw
722+
self._raw = None
723723
return raw
724724

725725
### Inquiries ###
@@ -733,6 +733,10 @@ def readable(self):
733733
def writable(self):
734734
return self.raw.writable()
735735

736+
@property
737+
def raw(self):
738+
return self._raw
739+
736740
@property
737741
def closed(self):
738742
return self.raw.closed
@@ -1444,7 +1448,7 @@ def __init__(self, buffer, encoding=None, errors=None, newline=None,
14441448
if not isinstance(errors, str):
14451449
raise ValueError("invalid errors: %r" % errors)
14461450

1447-
self.buffer = buffer
1451+
self._buffer = buffer
14481452
self._line_buffering = line_buffering
14491453
self._encoding = encoding
14501454
self._errors = errors
@@ -1499,6 +1503,10 @@ def errors(self):
14991503
def line_buffering(self):
15001504
return self._line_buffering
15011505

1506+
@property
1507+
def buffer(self):
1508+
return self._buffer
1509+
15021510
def seekable(self):
15031511
return self._seekable
15041512

@@ -1713,8 +1721,8 @@ def detach(self):
17131721
if self.buffer is None:
17141722
raise ValueError("buffer is already detached")
17151723
self.flush()
1716-
buffer = self.buffer
1717-
self.buffer = None
1724+
buffer = self._buffer
1725+
self._buffer = None
17181726
return buffer
17191727

17201728
def seek(self, cookie, whence=0):

Lib/test/test_io.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,13 @@ def test_multi_close(self):
693693
b.close()
694694
self.assertRaises(ValueError, b.flush)
695695

696+
def test_readonly_attributes(self):
697+
raw = self.MockRawIO()
698+
buf = self.tp(raw)
699+
x = self.MockRawIO()
700+
with self.assertRaises(AttributeError):
701+
buf.raw = x
702+
696703

697704
class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
698705
read_mode = "rb"
@@ -2210,6 +2217,12 @@ def test_multi_close(self):
22102217
txt.close()
22112218
self.assertRaises(ValueError, txt.flush)
22122219

2220+
def test_readonly_attributes(self):
2221+
txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2222+
buf = self.BytesIO(self.testdata)
2223+
with self.assertRaises(AttributeError):
2224+
txt.buffer = buf
2225+
22132226
class CTextIOWrapperTest(TextIOWrapperTest):
22142227

22152228
def test_initialization(self):

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ Core and Builtins
2424
Library
2525
-------
2626

27+
- Issue #10750: The ``raw`` attribute of buffered IO objects is now read-only.
28+
2729
- Issue #6791: Limit header line length (to 65535 bytes) in http.client
2830
and http.server, to avoid denial of services from the other party.
2931

Modules/_io/bufferedio.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,7 +1500,7 @@ static PyMethodDef bufferedreader_methods[] = {
15001500
};
15011501

15021502
static PyMemberDef bufferedreader_members[] = {
1503-
{"raw", T_OBJECT, offsetof(buffered, raw), 0},
1503+
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
15041504
{NULL}
15051505
};
15061506

@@ -1882,7 +1882,7 @@ static PyMethodDef bufferedwriter_methods[] = {
18821882
};
18831883

18841884
static PyMemberDef bufferedwriter_members[] = {
1885-
{"raw", T_OBJECT, offsetof(buffered, raw), 0},
1885+
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
18861886
{NULL}
18871887
};
18881888

@@ -2272,7 +2272,7 @@ static PyMethodDef bufferedrandom_methods[] = {
22722272
};
22732273

22742274
static PyMemberDef bufferedrandom_members[] = {
2275-
{"raw", T_OBJECT, offsetof(buffered, raw), 0},
2275+
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
22762276
{NULL}
22772277
};
22782278

0 commit comments

Comments
 (0)