mirror of https://github.com/python/cpython
Issue #28225: Merge from 3.6
This commit is contained in:
commit
f63f12b479
|
@ -61,6 +61,9 @@ All of the classes in this module may safely be accessed from multiple threads.
|
||||||
.. versionchanged:: 3.4
|
.. versionchanged:: 3.4
|
||||||
The ``'x'`` (exclusive creation) mode was added.
|
The ``'x'`` (exclusive creation) mode was added.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.6
|
||||||
|
Accepts a :term:`path-like object`.
|
||||||
|
|
||||||
|
|
||||||
.. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9)
|
.. class:: BZ2File(filename, mode='r', buffering=None, compresslevel=9)
|
||||||
|
|
||||||
|
@ -128,6 +131,9 @@ All of the classes in this module may safely be accessed from multiple threads.
|
||||||
The :meth:`~io.BufferedIOBase.read` method now accepts an argument of
|
The :meth:`~io.BufferedIOBase.read` method now accepts an argument of
|
||||||
``None``.
|
``None``.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.6
|
||||||
|
Accepts a :term:`path-like object`.
|
||||||
|
|
||||||
|
|
||||||
Incremental (de)compression
|
Incremental (de)compression
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
16
Lib/bz2.py
16
Lib/bz2.py
|
@ -11,6 +11,7 @@ __author__ = "Nadeem Vawda <nadeem.vawda@gmail.com>"
|
||||||
|
|
||||||
from builtins import open as _builtin_open
|
from builtins import open as _builtin_open
|
||||||
import io
|
import io
|
||||||
|
import os
|
||||||
import warnings
|
import warnings
|
||||||
import _compression
|
import _compression
|
||||||
|
|
||||||
|
@ -42,9 +43,9 @@ class BZ2File(_compression.BaseStream):
|
||||||
def __init__(self, filename, mode="r", buffering=None, compresslevel=9):
|
def __init__(self, filename, mode="r", buffering=None, compresslevel=9):
|
||||||
"""Open a bzip2-compressed file.
|
"""Open a bzip2-compressed file.
|
||||||
|
|
||||||
If filename is a str or bytes object, it gives the name
|
If filename is a str, bytes, or PathLike object, it gives the
|
||||||
of the file to be opened. Otherwise, it should be a file object,
|
name of the file to be opened. Otherwise, it should be a file
|
||||||
which will be used to read or write the compressed data.
|
object, which will be used to read or write the compressed data.
|
||||||
|
|
||||||
mode can be 'r' for reading (default), 'w' for (over)writing,
|
mode can be 'r' for reading (default), 'w' for (over)writing,
|
||||||
'x' for creating exclusively, or 'a' for appending. These can
|
'x' for creating exclusively, or 'a' for appending. These can
|
||||||
|
@ -91,7 +92,7 @@ class BZ2File(_compression.BaseStream):
|
||||||
else:
|
else:
|
||||||
raise ValueError("Invalid mode: %r" % (mode,))
|
raise ValueError("Invalid mode: %r" % (mode,))
|
||||||
|
|
||||||
if isinstance(filename, (str, bytes)):
|
if isinstance(filename, (str, bytes, os.PathLike)):
|
||||||
self._fp = _builtin_open(filename, mode)
|
self._fp = _builtin_open(filename, mode)
|
||||||
self._closefp = True
|
self._closefp = True
|
||||||
self._mode = mode_code
|
self._mode = mode_code
|
||||||
|
@ -99,7 +100,7 @@ class BZ2File(_compression.BaseStream):
|
||||||
self._fp = filename
|
self._fp = filename
|
||||||
self._mode = mode_code
|
self._mode = mode_code
|
||||||
else:
|
else:
|
||||||
raise TypeError("filename must be a str or bytes object, or a file")
|
raise TypeError("filename must be a str, bytes, file or PathLike object")
|
||||||
|
|
||||||
if self._mode == _MODE_READ:
|
if self._mode == _MODE_READ:
|
||||||
raw = _compression.DecompressReader(self._fp,
|
raw = _compression.DecompressReader(self._fp,
|
||||||
|
@ -289,8 +290,9 @@ def open(filename, mode="rb", compresslevel=9,
|
||||||
encoding=None, errors=None, newline=None):
|
encoding=None, errors=None, newline=None):
|
||||||
"""Open a bzip2-compressed file in binary or text mode.
|
"""Open a bzip2-compressed file in binary or text mode.
|
||||||
|
|
||||||
The filename argument can be an actual filename (a str or bytes
|
The filename argument can be an actual filename (a str, bytes, or
|
||||||
object), or an existing file object to read from or write to.
|
PathLike object), or an existing file object to read from or write
|
||||||
|
to.
|
||||||
|
|
||||||
The mode argument can be "r", "rb", "w", "wb", "x", "xb", "a" or
|
The mode argument can be "r", "rb", "w", "wb", "x", "xb", "a" or
|
||||||
"ab" for binary mode, or "rt", "wt", "xt" or "at" for text mode.
|
"ab" for binary mode, or "rt", "wt", "xt" or "at" for text mode.
|
||||||
|
|
|
@ -6,6 +6,7 @@ from io import BytesIO, DEFAULT_BUFFER_SIZE
|
||||||
import os
|
import os
|
||||||
import pickle
|
import pickle
|
||||||
import glob
|
import glob
|
||||||
|
import pathlib
|
||||||
import random
|
import random
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
@ -560,6 +561,13 @@ class BZ2FileTest(BaseTest):
|
||||||
with BZ2File(str_filename, "rb") as f:
|
with BZ2File(str_filename, "rb") as f:
|
||||||
self.assertEqual(f.read(), self.DATA)
|
self.assertEqual(f.read(), self.DATA)
|
||||||
|
|
||||||
|
def testOpenPathLikeFilename(self):
|
||||||
|
filename = pathlib.Path(self.filename)
|
||||||
|
with BZ2File(filename, "wb") as f:
|
||||||
|
f.write(self.DATA)
|
||||||
|
with BZ2File(filename, "rb") as f:
|
||||||
|
self.assertEqual(f.read(), self.DATA)
|
||||||
|
|
||||||
def testDecompressLimited(self):
|
def testDecompressLimited(self):
|
||||||
"""Decompressed data buffering should be limited"""
|
"""Decompressed data buffering should be limited"""
|
||||||
bomb = bz2.compress(b'\0' * int(2e6), compresslevel=9)
|
bomb = bz2.compress(b'\0' * int(2e6), compresslevel=9)
|
||||||
|
|
|
@ -54,6 +54,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #28225: bz2 module now supports pathlib. Initial patch by Ethan Furman.
|
||||||
|
|
||||||
- Issue #28227: gzip now supports pathlib. Patch by Ethan Furman.
|
- Issue #28227: gzip now supports pathlib. Patch by Ethan Furman.
|
||||||
|
|
||||||
- Issue #28332: Deprecated silent truncations in socket.htons and socket.ntohs.
|
- Issue #28332: Deprecated silent truncations in socket.htons and socket.ntohs.
|
||||||
|
|
Loading…
Reference in New Issue