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

Skip to content

Commit 59406a9

Browse files
committed
officially deprecated max_buffer_size
1 parent 1ef7c6b commit 59406a9

4 files changed

Lines changed: 65 additions & 15 deletions

File tree

Lib/_pyio.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import os
66
import abc
77
import codecs
8+
import warnings
89
# Import _thread instead of threading to reduce startup cost
910
try:
1011
from _thread import allocate_lock as Lock
@@ -960,16 +961,20 @@ class BufferedWriter(_BufferedIOMixin):
960961
961962
The constructor creates a BufferedWriter for the given writeable raw
962963
stream. If the buffer_size is not given, it defaults to
963-
DEFAULT_BUFFER_SIZE. If max_buffer_size is omitted, it defaults to
964-
twice the buffer size.
964+
DEFAULT_BUFFER_SIZE.
965965
"""
966966

967+
_warning_stack_offset = 2
968+
967969
def __init__(self, raw,
968970
buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
969971
raw._checkWritable()
970972
_BufferedIOMixin.__init__(self, raw)
971973
if buffer_size <= 0:
972974
raise ValueError("invalid buffer size")
975+
if max_buffer_size is not None:
976+
warnings.warn("max_buffer_size is deprecated", DeprecationWarning,
977+
self._warning_stack_offset)
973978
self.buffer_size = buffer_size
974979
self._write_buf = bytearray()
975980
self._write_lock = Lock()
@@ -1055,8 +1060,7 @@ class BufferedRWPair(BufferedIOBase):
10551060
10561061
reader and writer are RawIOBase objects that are readable and
10571062
writeable respectively. If the buffer_size is omitted it defaults to
1058-
DEFAULT_BUFFER_SIZE. The max_buffer_size (for the buffered writer)
1059-
defaults to twice the buffer size.
1063+
DEFAULT_BUFFER_SIZE.
10601064
"""
10611065

10621066
# XXX The usefulness of this (compared to having two separate IO
@@ -1068,10 +1072,12 @@ def __init__(self, reader, writer,
10681072
10691073
The arguments are two RawIO instances.
10701074
"""
1075+
if max_buffer_size is not None:
1076+
warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2)
10711077
reader._checkReadable()
10721078
writer._checkWritable()
10731079
self.reader = BufferedReader(reader, buffer_size)
1074-
self.writer = BufferedWriter(writer, buffer_size, max_buffer_size)
1080+
self.writer = BufferedWriter(writer, buffer_size)
10751081

10761082
def read(self, n=None):
10771083
if n is None:
@@ -1117,10 +1123,11 @@ class BufferedRandom(BufferedWriter, BufferedReader):
11171123
11181124
The constructor creates a reader and writer for a seekable stream,
11191125
raw, given in the first argument. If the buffer_size is omitted it
1120-
defaults to DEFAULT_BUFFER_SIZE. The max_buffer_size (for the buffered
1121-
writer) defaults to twice the buffer size.
1126+
defaults to DEFAULT_BUFFER_SIZE.
11221127
"""
11231128

1129+
_warning_stack_offset = 3
1130+
11241131
def __init__(self, raw,
11251132
buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
11261133
raw._checkSeekable()

Lib/test/test_io.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import threading
2727
import random
2828
import unittest
29+
import warnings
2930
import weakref
3031
import gc
3132
import abc
@@ -861,7 +862,7 @@ def test_writes_and_truncates(self):
861862

862863
def test_write_non_blocking(self):
863864
raw = self.MockNonBlockWriterIO()
864-
bufio = self.tp(raw, 8, 8)
865+
bufio = self.tp(raw, 8)
865866

866867
self.assertEquals(bufio.write(b"abcd"), 4)
867868
self.assertEquals(bufio.write(b"efghi"), 5)
@@ -979,6 +980,17 @@ def test_misbehaved_io(self):
979980
self.assertRaises(IOError, bufio.tell)
980981
self.assertRaises(IOError, bufio.write, b"abcdef")
981982

983+
def test_max_buffer_size_deprecation(self):
984+
with support.check_warnings() as w:
985+
warnings.simplefilter("always", DeprecationWarning)
986+
self.tp(self.MockRawIO(), 8, 12)
987+
self.assertEqual(len(w.warnings), 1)
988+
warning = w.warnings[0]
989+
self.assertTrue(warning.category is DeprecationWarning)
990+
self.assertEqual(str(warning.message),
991+
"max_buffer_size is deprecated")
992+
993+
982994
class CBufferedWriterTest(BufferedWriterTest):
983995
tp = io.BufferedWriter
984996

@@ -1029,6 +1041,16 @@ def test_basic(self):
10291041
pair = self.tp(r, w)
10301042
self.assertFalse(pair.closed)
10311043

1044+
def test_max_buffer_size_deprecation(self):
1045+
with support.check_warnings() as w:
1046+
warnings.simplefilter("always", DeprecationWarning)
1047+
self.tp(self.MockRawIO(), self.MockRawIO(), 8, 12)
1048+
self.assertEqual(len(w.warnings), 1)
1049+
warning = w.warnings[0]
1050+
self.assertTrue(warning.category is DeprecationWarning)
1051+
self.assertEqual(str(warning.message),
1052+
"max_buffer_size is deprecated")
1053+
10321054
# XXX More Tests
10331055

10341056
class CBufferedRWPairTest(BufferedRWPairTest):
@@ -1048,7 +1070,7 @@ def test_constructor(self):
10481070

10491071
def test_read_and_write(self):
10501072
raw = self.MockRawIO((b"asdf", b"ghjk"))
1051-
rw = self.tp(raw, 8, 12)
1073+
rw = self.tp(raw, 8)
10521074

10531075
self.assertEqual(b"as", rw.read(2))
10541076
rw.write(b"ddd")

Misc/NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ Core and Builtins
4141
Library
4242
-------
4343

44+
- The max_buffer_size arguments of io.BufferedWriter, io.BufferedRWPair, and
45+
io.BufferedRandom have been deprecated for removal in Python 3.2.
46+
4447
- Issue #5068: Fixed the tarfile._BZ2Proxy.read() method that would loop
4548
forever on incomplete input. That caused tarfile.open() to hang when used
4649
with mode 'r' or 'r:bz2' and a fileobj argument that contained no data or

Modules/_bufferedio.c

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1415,6 +1415,16 @@ PyTypeObject PyBufferedReader_Type = {
14151415
};
14161416

14171417

1418+
1419+
static int
1420+
complain_about_max_buffer_size(void)
1421+
{
1422+
if (PyErr_WarnEx(PyExc_DeprecationWarning,
1423+
"max_buffer_size is deprecated", 1) < 0)
1424+
return 0;
1425+
return 1;
1426+
}
1427+
14181428
/*
14191429
* class BufferedWriter
14201430
*/
@@ -1439,7 +1449,7 @@ BufferedWriter_init(BufferedObject *self, PyObject *args, PyObject *kwds)
14391449
/* TODO: properly deprecate max_buffer_size */
14401450
char *kwlist[] = {"raw", "buffer_size", "max_buffer_size", NULL};
14411451
Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;
1442-
Py_ssize_t max_buffer_size = -1;
1452+
Py_ssize_t max_buffer_size = -234;
14431453
PyObject *raw;
14441454

14451455
self->ok = 0;
@@ -1449,6 +1459,9 @@ BufferedWriter_init(BufferedObject *self, PyObject *args, PyObject *kwds)
14491459
return -1;
14501460
}
14511461

1462+
if (max_buffer_size != -234 && !complain_about_max_buffer_size())
1463+
return -1;
1464+
14521465
if (_PyIOBase_checkWritable(raw, Py_True) == NULL)
14531466
return -1;
14541467

@@ -1767,8 +1780,7 @@ PyDoc_STRVAR(BufferedRWPair_doc,
17671780
"\n"
17681781
"reader and writer are RawIOBase objects that are readable and\n"
17691782
"writeable respectively. If the buffer_size is omitted it defaults to\n"
1770-
"DEFAULT_BUFFER_SIZE. The max_buffer_size (for the buffered writer)\n"
1771-
"defaults to twice the buffer size.\n"
1783+
"DEFAULT_BUFFER_SIZE.\n"
17721784
);
17731785

17741786
/* XXX The usefulness of this (compared to having two separate IO objects) is
@@ -1789,13 +1801,16 @@ BufferedRWPair_init(BufferedRWPairObject *self, PyObject *args,
17891801
{
17901802
PyObject *reader, *writer;
17911803
Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;
1792-
Py_ssize_t max_buffer_size = -1;
1804+
Py_ssize_t max_buffer_size = -234;
17931805

17941806
if (!PyArg_ParseTuple(args, "OO|nn:BufferedRWPair", &reader, &writer,
17951807
&buffer_size, &max_buffer_size)) {
17961808
return -1;
17971809
}
17981810

1811+
if (max_buffer_size != -234 && !complain_about_max_buffer_size())
1812+
return -1;
1813+
17991814
if (_PyIOBase_checkReadable(reader, Py_True) == NULL)
18001815
return -1;
18011816
if (_PyIOBase_checkWritable(writer, Py_True) == NULL)
@@ -1812,7 +1827,7 @@ BufferedRWPair_init(BufferedRWPairObject *self, PyObject *args,
18121827
if (self->reader == NULL)
18131828
return -1;
18141829

1815-
args = Py_BuildValue("(nn)", buffer_size, max_buffer_size);
1830+
args = Py_BuildValue("(n)", buffer_size);
18161831
if (args == NULL) {
18171832
Py_CLEAR(self->reader);
18181833
return -1;
@@ -2016,7 +2031,7 @@ BufferedRandom_init(BufferedObject *self, PyObject *args, PyObject *kwds)
20162031
{
20172032
char *kwlist[] = {"raw", "buffer_size", "max_buffer_size", NULL};
20182033
Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;
2019-
Py_ssize_t max_buffer_size = -1;
2034+
Py_ssize_t max_buffer_size = -234;
20202035
PyObject *raw;
20212036

20222037
self->ok = 0;
@@ -2026,6 +2041,9 @@ BufferedRandom_init(BufferedObject *self, PyObject *args, PyObject *kwds)
20262041
return -1;
20272042
}
20282043

2044+
if (max_buffer_size != -234 && !complain_about_max_buffer_size())
2045+
return -1;
2046+
20292047
if (_PyIOBase_checkSeekable(raw, Py_True) == NULL)
20302048
return -1;
20312049
if (_PyIOBase_checkReadable(raw, Py_True) == NULL)

0 commit comments

Comments
 (0)