Kaydet (Commit) a8abe097 authored tarafından Matthias Bussonnier's avatar Matthias Bussonnier Kaydeden (comit) Inada Naoki

bpo-33461: emit DeprecationWarning when json.loads(encoding=...) is used (GH-6762)

üst 5909ad12
...@@ -265,18 +265,21 @@ Basic Usage ...@@ -265,18 +265,21 @@ Basic Usage
*fp* can now be a :term:`binary file`. The input encoding should be *fp* can now be a :term:`binary file`. The input encoding should be
UTF-8, UTF-16 or UTF-32. 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` Deserialize *s* (a :class:`str`, :class:`bytes` or :class:`bytearray`
instance containing a JSON document) to a Python object using this instance containing a JSON document) to a Python object using this
:ref:`conversion table <json-to-py-table>`. :ref:`conversion table <json-to-py-table>`.
The other arguments have the same meaning as in :func:`load`, except 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 If the data being deserialized is not a valid JSON document, a
:exc:`JSONDecodeError` will be raised. :exc:`JSONDecodeError` will be raised.
.. deprecated-removed:: 3.1 3.9
*encoding* keyword argument.
.. versionchanged:: 3.6 .. versionchanged:: 3.6
*s* can now be of type :class:`bytes` or :class:`bytearray`. The *s* can now be of type :class:`bytes` or :class:`bytearray`. The
input encoding should be UTF-8, UTF-16 or UTF-32. input encoding should be UTF-8, UTF-16 or UTF-32.
......
...@@ -296,7 +296,7 @@ def load(fp, *, cls=None, object_hook=None, parse_float=None, ...@@ -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) 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): parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance """Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
containing a JSON document) to a Python object. 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, ...@@ -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`` To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
kwarg; otherwise ``JSONDecoder`` is used. 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 isinstance(s, str):
if s.startswith('\ufeff'): if s.startswith('\ufeff'):
...@@ -342,6 +342,15 @@ def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, ...@@ -342,6 +342,15 @@ def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
f'not {s.__class__.__name__}') f'not {s.__class__.__name__}')
s = s.decode(detect_encoding(s), 'surrogatepass') 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 if (cls is None and object_hook is None and
parse_int is None and parse_float 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): parse_constant is None and object_pairs_hook is None and not kw):
......
...@@ -95,5 +95,9 @@ class TestDecode: ...@@ -95,5 +95,9 @@ class TestDecode:
d = self.json.JSONDecoder() d = self.json.JSONDecoder()
self.assertRaises(ValueError, d.raw_decode, 'a'*42, -50000) 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 TestPyDecode(TestDecode, PyTest): pass
class TestCDecode(TestDecode, CTest): pass class TestCDecode(TestDecode, CTest): pass
``json.loads`` now emits ``DeprecationWarning`` when ``encoding`` option is
specified. Patch by Matthias Bussonnier.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment