Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-39357: Remove buffering parameter of bz2.BZ2File #18028

Merged
merged 1 commit into from
Jan 16, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions Doc/library/bz2.rst
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ All of the classes in this module may safely be accessed from multiple threads.
Accepts a :term:`path-like object`.


.. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9)
.. class:: BZ2File(filename, mode='r', *, compresslevel=9)

Open a bzip2-compressed file in binary mode.

Expand All @@ -81,8 +81,6 @@ All of the classes in this module may safely be accessed from multiple threads.
If *filename* is a file object (rather than an actual file name), a mode of
``'w'`` does not truncate the file, and is instead equivalent to ``'a'``.

The *buffering* argument is ignored. Its use is deprecated since Python 3.0.

If *mode* is ``'w'`` or ``'a'``, *compresslevel* can be an integer between
``1`` and ``9`` specifying the level of compression: ``1`` produces the
least compression, and ``9`` (default) produces the most compression.
Expand Down Expand Up @@ -110,9 +108,6 @@ All of the classes in this module may safely be accessed from multiple threads.
.. versionadded:: 3.3


.. deprecated:: 3.0
The keyword argument *buffering* was deprecated and is now ignored.

.. versionchanged:: 3.1
Support for the :keyword:`with` statement was added.

Expand All @@ -138,6 +133,13 @@ All of the classes in this module may safely be accessed from multiple threads.
.. versionchanged:: 3.6
Accepts a :term:`path-like object`.

.. versionchanged:: 3.9
The *buffering* parameter has been removed. It was ignored and deprecated
since Python 3.0. Pass an open file object to control how the file is
opened.

The *compresslevel* parameter became keyword-only.


Incremental (de)compression
---------------------------
Expand Down
10 changes: 10 additions & 0 deletions Doc/whatsnew/3.9.rst
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,12 @@ Removed
3.5 (:issue:`22486`): use :func:`math.gcd` instead.
(Contributed by Victor Stinner in :issue:`39350`.)

* The *buffering* parameter of :class:`bz2.BZ2File` has been removed. Since
Python 3.0, it was ignored and using it was emitting
:exc:`DeprecationWarning`. Pass an open file object to control how the file
is opened.
(Contributed by Victor Stinner in :issue:`39357`.)


Porting to Python 3.9
=====================
Expand Down Expand Up @@ -451,6 +457,10 @@ Changes in the Python API
:data:`~errno.EBADF` error.
(Contributed by Victor Stinner in :issue:`39239`.)

* The *compresslevel* parameter of :class:`bz2.BZ2File` became keyword-only,
since the *buffering* parameter has been removed.
(Contributed by Victor Stinner in :issue:`39357`.)


CPython bytecode changes
------------------------
Expand Down
10 changes: 1 addition & 9 deletions Lib/bz2.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@
# Value 2 no longer used
_MODE_WRITE = 3

_sentinel = object()


class BZ2File(_compression.BaseStream):

Expand All @@ -38,7 +36,7 @@ class BZ2File(_compression.BaseStream):
returned as bytes, and data to be written should be given as bytes.
"""

def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9):
def __init__(self, filename, mode="r", *, compresslevel=9):
"""Open a bzip2-compressed file.

If filename is a str, bytes, or PathLike object, it gives the
Expand All @@ -65,12 +63,6 @@ def __init__(self, filename, mode="r", buffering=_sentinel, compresslevel=9):
self._closefp = False
self._mode = _MODE_CLOSED

if buffering is not _sentinel:
warnings.warn("Use of 'buffering' argument is deprecated and ignored "
"since Python 3.0.",
DeprecationWarning,
stacklevel=2)

if not (1 <= compresslevel <= 9):
raise ValueError("compresslevel must be between 1 and 9")

Expand Down
3 changes: 3 additions & 0 deletions Lib/test/test_bz2.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ def testBadArgs(self):
self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=0)
self.assertRaises(ValueError, BZ2File, os.devnull, compresslevel=10)

# compresslevel is keyword-only
self.assertRaises(TypeError, BZ2File, os.devnull, "r", 3)

def testRead(self):
self.createTempFile()
with BZ2File(self.filename) as bz2f:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Remove the *buffering* parameter of :class:`bz2.BZ2File`. Since Python 3.0, it
was ignored and using it was emitting :exc:`DeprecationWarning`. Pass an open
file object, to control how the file is opened. The *compresslevel* parameter
becomes keyword-only.