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

Skip to content

Commit a264384

Browse files
committed
Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
Patch by Serhiy Storchaka.
2 parents 2b16844 + 10f0c50 commit a264384

3 files changed

Lines changed: 34 additions & 3 deletions

File tree

Lib/test/test_io.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,20 @@ def test_readonly_attributes(self):
802802
buf.raw = x
803803

804804

805+
class SizeofTest:
806+
807+
@support.cpython_only
808+
def test_sizeof(self):
809+
bufsize1 = 4096
810+
bufsize2 = 8192
811+
rawio = self.MockRawIO()
812+
bufio = self.tp(rawio, buffer_size=bufsize1)
813+
size = sys.getsizeof(bufio) - bufsize1
814+
rawio = self.MockRawIO()
815+
bufio = self.tp(rawio, buffer_size=bufsize2)
816+
self.assertEqual(sys.getsizeof(bufio), size + bufsize2)
817+
818+
805819
class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
806820
read_mode = "rb"
807821

@@ -999,7 +1013,7 @@ def test_no_extraneous_read(self):
9991013
"failed for {}: {} != 0".format(n, rawio._extraneous_reads))
10001014

10011015

1002-
class CBufferedReaderTest(BufferedReaderTest):
1016+
class CBufferedReaderTest(BufferedReaderTest, SizeofTest):
10031017
tp = io.BufferedReader
10041018

10051019
def test_constructor(self):
@@ -1260,7 +1274,7 @@ def test_max_buffer_size_removal(self):
12601274
self.tp(self.MockRawIO(), 8, 12)
12611275

12621276

1263-
class CBufferedWriterTest(BufferedWriterTest):
1277+
class CBufferedWriterTest(BufferedWriterTest, SizeofTest):
12641278
tp = io.BufferedWriter
12651279

12661280
def test_constructor(self):
@@ -1650,7 +1664,7 @@ def test_interleaved_readline_write(self):
16501664
# You can't construct a BufferedRandom over a non-seekable stream.
16511665
test_unseekable = None
16521666

1653-
class CBufferedRandomTest(BufferedRandomTest):
1667+
class CBufferedRandomTest(BufferedRandomTest, SizeofTest):
16541668
tp = io.BufferedRandom
16551669

16561670
def test_constructor(self):

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,9 @@ Core and Builtins
334334
Library
335335
-------
336336

337+
- Issue #15487: Add a __sizeof__ implementation for buffered I/O objects.
338+
Patch by Serhiy Storchaka.
339+
337340
- Issue #15187: Bugfix: remove temporary directories test_shutil was leaving
338341
behind.
339342

Modules/_io/bufferedio.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,17 @@ buffered_dealloc(buffered *self)
398398
Py_TYPE(self)->tp_free((PyObject *)self);
399399
}
400400

401+
static PyObject *
402+
buffered_sizeof(buffered *self, void *unused)
403+
{
404+
Py_ssize_t res;
405+
406+
res = sizeof(buffered);
407+
if (self->buffer)
408+
res += self->buffer_size;
409+
return PyLong_FromSsize_t(res);
410+
}
411+
401412
static int
402413
buffered_traverse(buffered *self, visitproc visit, void *arg)
403414
{
@@ -1699,6 +1710,7 @@ static PyMethodDef bufferedreader_methods[] = {
16991710
{"seek", (PyCFunction)buffered_seek, METH_VARARGS},
17001711
{"tell", (PyCFunction)buffered_tell, METH_NOARGS},
17011712
{"truncate", (PyCFunction)buffered_truncate, METH_VARARGS},
1713+
{"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},
17021714
{NULL, NULL}
17031715
};
17041716

@@ -2079,6 +2091,7 @@ static PyMethodDef bufferedwriter_methods[] = {
20792091
{"flush", (PyCFunction)buffered_flush, METH_NOARGS},
20802092
{"seek", (PyCFunction)buffered_seek, METH_VARARGS},
20812093
{"tell", (PyCFunction)buffered_tell, METH_NOARGS},
2094+
{"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},
20822095
{NULL, NULL}
20832096
};
20842097

@@ -2470,6 +2483,7 @@ static PyMethodDef bufferedrandom_methods[] = {
24702483
{"readline", (PyCFunction)buffered_readline, METH_VARARGS},
24712484
{"peek", (PyCFunction)buffered_peek, METH_VARARGS},
24722485
{"write", (PyCFunction)bufferedwriter_write, METH_VARARGS},
2486+
{"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},
24732487
{NULL, NULL}
24742488
};
24752489

0 commit comments

Comments
 (0)