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

Skip to content

Commit 7f8f418

Browse files
committed
Issue #10750: The raw attribute of buffered IO objects is now read-only.
1 parent cfee0e8 commit 7f8f418

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
@@ -676,7 +676,7 @@ class _BufferedIOMixin(BufferedIOBase):
676676
"""
677677

678678
def __init__(self, raw):
679-
self.raw = raw
679+
self._raw = raw
680680

681681
### Positioning ###
682682

@@ -720,8 +720,8 @@ def detach(self):
720720
if self.raw is None:
721721
raise ValueError("raw stream already detached")
722722
self.flush()
723-
raw = self.raw
724-
self.raw = None
723+
raw = self._raw
724+
self._raw = None
725725
return raw
726726

727727
### Inquiries ###
@@ -735,6 +735,10 @@ def readable(self):
735735
def writable(self):
736736
return self.raw.writable()
737737

738+
@property
739+
def raw(self):
740+
return self._raw
741+
738742
@property
739743
def closed(self):
740744
return self.raw.closed
@@ -1465,7 +1469,7 @@ def __init__(self, buffer, encoding=None, errors=None, newline=None,
14651469
if not isinstance(errors, str):
14661470
raise ValueError("invalid errors: %r" % errors)
14671471

1468-
self.buffer = buffer
1472+
self._buffer = buffer
14691473
self._line_buffering = line_buffering
14701474
self._encoding = encoding
14711475
self._errors = errors
@@ -1520,6 +1524,10 @@ def errors(self):
15201524
def line_buffering(self):
15211525
return self._line_buffering
15221526

1527+
@property
1528+
def buffer(self):
1529+
return self._buffer
1530+
15231531
def seekable(self):
15241532
return self._seekable
15251533

@@ -1734,8 +1742,8 @@ def detach(self):
17341742
if self.buffer is None:
17351743
raise ValueError("buffer is already detached")
17361744
self.flush()
1737-
buffer = self.buffer
1738-
self.buffer = None
1745+
buffer = self._buffer
1746+
self._buffer = None
17391747
return buffer
17401748

17411749
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
@@ -730,6 +730,13 @@ def test_unseekable(self):
730730
self.assertRaises(self.UnsupportedOperation, bufio.tell)
731731
self.assertRaises(self.UnsupportedOperation, bufio.seek, 0)
732732

733+
def test_readonly_attributes(self):
734+
raw = self.MockRawIO()
735+
buf = self.tp(raw)
736+
x = self.MockRawIO()
737+
with self.assertRaises(AttributeError):
738+
buf.raw = x
739+
733740

734741
class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
735742
read_mode = "rb"
@@ -2245,6 +2252,12 @@ def test_unseekable(self):
22452252
self.assertRaises(self.UnsupportedOperation, txt.tell)
22462253
self.assertRaises(self.UnsupportedOperation, txt.seek, 0)
22472254

2255+
def test_readonly_attributes(self):
2256+
txt = self.TextIOWrapper(self.BytesIO(self.testdata), encoding="ascii")
2257+
buf = self.BytesIO(self.testdata)
2258+
with self.assertRaises(AttributeError):
2259+
txt.buffer = buf
2260+
22482261
class CTextIOWrapperTest(TextIOWrapperTest):
22492262

22502263
def test_initialization(self):

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Core and Builtins
1111
Library
1212
-------
1313

14+
- Issue #10750: The ``raw`` attribute of buffered IO objects is now read-only.
15+
1416
- Deprecated assertDictContainsSubclass() in the unittest module.
1517

1618

Modules/_io/bufferedio.c

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

15431543
static PyMemberDef bufferedreader_members[] = {
1544-
{"raw", T_OBJECT, offsetof(buffered, raw), 0},
1544+
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
15451545
{NULL}
15461546
};
15471547

@@ -1926,7 +1926,7 @@ static PyMethodDef bufferedwriter_methods[] = {
19261926
};
19271927

19281928
static PyMemberDef bufferedwriter_members[] = {
1929-
{"raw", T_OBJECT, offsetof(buffered, raw), 0},
1929+
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
19301930
{NULL}
19311931
};
19321932

@@ -2320,7 +2320,7 @@ static PyMethodDef bufferedrandom_methods[] = {
23202320
};
23212321

23222322
static PyMemberDef bufferedrandom_members[] = {
2323-
{"raw", T_OBJECT, offsetof(buffered, raw), 0},
2323+
{"raw", T_OBJECT, offsetof(buffered, raw), READONLY},
23242324
{NULL}
23252325
};
23262326

0 commit comments

Comments
 (0)