Browse Source
bpo-43510: PEP 597: Accept `encoding="locale"` in binary mode (GH-25103)
It make `encoding="locale"` usable everywhere `encoding=None` is
allowed.
pull/25108/head
Inada Naoki
5 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
14 additions and
2 deletions
-
Lib/_pyio.py
-
Lib/test/test_io.py
-
Modules/_io/_iomodule.c
|
|
|
@ -221,7 +221,7 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None, |
|
|
|
raise ValueError("can't have read/write/append mode at once") |
|
|
|
if not (creating or reading or writing or appending): |
|
|
|
raise ValueError("must have exactly one of read/write/append mode") |
|
|
|
if binary and encoding is not None: |
|
|
|
if binary and encoding is not None and encoding != "locale": |
|
|
|
raise ValueError("binary mode doesn't take an encoding argument") |
|
|
|
if binary and errors is not None: |
|
|
|
raise ValueError("binary mode doesn't take an errors argument") |
|
|
|
|
|
|
|
@ -531,6 +531,17 @@ class IOTest(unittest.TestCase): |
|
|
|
self.assertRaises(OSError, obj.truncate) |
|
|
|
self.assertRaises(OSError, obj.truncate, 0) |
|
|
|
|
|
|
|
def test_open_binmode_encoding(self): |
|
|
|
"""open() raises ValueError when encoding is specified in bin mode""" |
|
|
|
self.assertRaises(ValueError, self.open, os_helper.TESTFN, |
|
|
|
"wb", encoding="utf-8") |
|
|
|
|
|
|
|
# encoding=None and encoding="locale" is allowed. |
|
|
|
with self.open(os_helper.TESTFN, "wb", encoding=None): |
|
|
|
pass |
|
|
|
with self.open(os_helper.TESTFN, "wb", encoding="locale"): |
|
|
|
pass |
|
|
|
|
|
|
|
def test_open_handles_NUL_chars(self): |
|
|
|
fn_with_NUL = 'foo\0bar' |
|
|
|
self.assertRaises(ValueError, self.open, fn_with_NUL, 'w') |
|
|
|
|
|
|
|
@ -346,7 +346,8 @@ _io_open_impl(PyObject *module, PyObject *file, const char *mode, |
|
|
|
goto error; |
|
|
|
} |
|
|
|
|
|
|
|
if (binary && encoding != NULL) { |
|
|
|
if (binary && encoding != NULL |
|
|
|
&& strcmp(encoding, "locale") != 0) { |
|
|
|
PyErr_SetString(PyExc_ValueError, |
|
|
|
"binary mode doesn't take an encoding argument"); |
|
|
|
goto error; |
|
|
|
|