[Python-checkins] bpo-33461: emit DeprecationWarning when json.loads(encoding=...) is used (GH-6762)
Inada Naoki
webhook-mailer at python.org
Tue Apr 9 03:17:28 EDT 2019
https://github.com/python/cpython/commit/a8abe097c1165db25b429ca02a65c4f8acbc062b
commit: a8abe097c1165db25b429ca02a65c4f8acbc062b
branch: master
author: Matthias Bussonnier <bussonniermatthias at gmail.com>
committer: Inada Naoki <songofacandy at gmail.com>
date: 2019-04-09T16:17:25+09:00
summary:
bpo-33461: emit DeprecationWarning when json.loads(encoding=...) is used (GH-6762)
files:
A Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst
M Doc/library/json.rst
M Lib/json/__init__.py
M Lib/test/test_json/test_decode.py
diff --git a/Doc/library/json.rst b/Doc/library/json.rst
index 589e86ca8107..b476c372370d 100644
--- a/Doc/library/json.rst
+++ b/Doc/library/json.rst
@@ -265,18 +265,21 @@ Basic Usage
*fp* can now be a :term:`binary file`. The input encoding should be
UTF-8, UTF-16 or UTF-32.
-.. function:: loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
+.. function:: loads(s, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
Deserialize *s* (a :class:`str`, :class:`bytes` or :class:`bytearray`
instance containing a JSON document) to a Python object using this
:ref:`conversion table <json-to-py-table>`.
The other arguments have the same meaning as in :func:`load`, except
- *encoding* which is ignored and deprecated.
+ *encoding* which is ignored and deprecated since Python 3.1.
If the data being deserialized is not a valid JSON document, a
:exc:`JSONDecodeError` will be raised.
+ .. deprecated-removed:: 3.1 3.9
+ *encoding* keyword argument.
+
.. versionchanged:: 3.6
*s* can now be of type :class:`bytes` or :class:`bytearray`. The
input encoding should be UTF-8, UTF-16 or UTF-32.
diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py
index 3bb4490e818b..1ba8b48bd78c 100644
--- a/Lib/json/__init__.py
+++ b/Lib/json/__init__.py
@@ -296,7 +296,7 @@ def load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
-def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
+def loads(s, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
containing a JSON document) to a Python object.
@@ -330,7 +330,7 @@ def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
kwarg; otherwise ``JSONDecoder`` is used.
- The ``encoding`` argument is ignored and deprecated.
+ The ``encoding`` argument is ignored and deprecated since Python 3.1.
"""
if isinstance(s, str):
if s.startswith('\ufeff'):
@@ -342,6 +342,15 @@ def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
f'not {s.__class__.__name__}')
s = s.decode(detect_encoding(s), 'surrogatepass')
+ if "encoding" in kw:
+ import warnings
+ warnings.warn(
+ "'encoding' is ignored and deprecated. It will be removed in Python 3.9",
+ DeprecationWarning,
+ stacklevel=2
+ )
+ del kw['encoding']
+
if (cls is None and object_hook is None and
parse_int is None and parse_float is None and
parse_constant is None and object_pairs_hook is None and not kw):
diff --git a/Lib/test/test_json/test_decode.py b/Lib/test/test_json/test_decode.py
index fdb9e62124ec..895c95b54c3b 100644
--- a/Lib/test/test_json/test_decode.py
+++ b/Lib/test/test_json/test_decode.py
@@ -95,5 +95,9 @@ def test_negative_index(self):
d = self.json.JSONDecoder()
self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000)
+ def test_deprecated_encode(self):
+ with self.assertWarns(DeprecationWarning):
+ self.loads('{}', encoding='fake')
+
class TestPyDecode(TestDecode, PyTest): pass
class TestCDecode(TestDecode, CTest): pass
diff --git a/Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst b/Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst
new file mode 100644
index 000000000000..12b3bceaf8e3
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst
@@ -0,0 +1,2 @@
+``json.loads`` now emits ``DeprecationWarning`` when ``encoding`` option is
+specified. Patch by Matthias Bussonnier.
More information about the Python-checkins
mailing list