]> granicus.if.org Git - python/commitdiff
bpo-33461: emit DeprecationWarning when json.loads(encoding=...) is used (GH-6762)
authorMatthias Bussonnier <bussonniermatthias@gmail.com>
Tue, 9 Apr 2019 07:17:25 +0000 (00:17 -0700)
committerInada Naoki <songofacandy@gmail.com>
Tue, 9 Apr 2019 07:17:25 +0000 (16:17 +0900)
Doc/library/json.rst
Lib/json/__init__.py
Lib/test/test_json/test_decode.py
Misc/NEWS.d/next/Library/2019-04-09-14-46-28.bpo-33461.SYJM-E.rst [new file with mode: 0644]

index 589e86ca81071bd2bbd51f998cb62e84aba33b56..b476c372370d067f8bc412d4cfd4dc847b3e7a0f 100644 (file)
@@ -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.
index 3bb4490e818ba0341003763b963ed7635bcb9004..1ba8b48bd78cde58ef1d3644529394d877ae216c 100644 (file)
@@ -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):
index fdb9e62124ece1f3c0446088d0b8fc7f130ae9bb..895c95b54c3b6556dcd01536a5197270fb9e771f 100644 (file)
@@ -95,5 +95,9 @@ class TestDecode:
         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 (file)
index 0000000..12b3bce
--- /dev/null
@@ -0,0 +1,2 @@
+``json.loads`` now emits ``DeprecationWarning`` when ``encoding`` option is
+specified.  Patch by Matthias Bussonnier.