]> granicus.if.org Git - python/commitdiff
bpo-29196: Removed old-deprecated classes Plist, Dict and _InternalDict (#488)
authorSerhiy Storchaka <storchaka@gmail.com>
Mon, 15 May 2017 10:21:31 +0000 (13:21 +0300)
committerGitHub <noreply@github.com>
Mon, 15 May 2017 10:21:31 +0000 (13:21 +0300)
in the plistlib module.  Dict values in the result of functions
readPlist() and readPlistFromBytes() are now exact dicts.

Doc/library/plistlib.rst
Doc/whatsnew/3.7.rst
Lib/plistlib.py
Lib/test/test_plistlib.py
Misc/NEWS

index 9ba226607d1feee2156ffa54adf729e699f56edf..7d306a2bcaf11ceb2e6720ec0717ea6ee3ad7c44 100644 (file)
@@ -133,14 +133,12 @@ The following functions are deprecated:
    This function calls :func:`load` to do the actual work, see the documentation
    of :func:`that function <load>` for an explanation of the keyword arguments.
 
-   .. note::
-
-      Dict values in the result have a ``__getattr__`` method that defers
-      to ``__getitem_``. This means that you can use attribute access to
-      access items of these dictionaries.
-
    .. deprecated:: 3.4 Use :func:`load` instead.
 
+   .. versionchanged:: 3.7
+      Dict values in the result are now normal dicts.  You no longer can use
+      attribute access to access items of these dictionaries.
+
 
 .. function:: writePlist(rootObject, pathOrFile)
 
@@ -156,14 +154,12 @@ The following functions are deprecated:
 
    See :func:`load` for a description of the keyword arguments.
 
-   .. note::
-
-      Dict values in the result have a ``__getattr__`` method that defers
-      to ``__getitem_``. This means that you can use attribute access to
-      access items of these dictionaries.
-
    .. deprecated:: 3.4 Use :func:`loads` instead.
 
+   .. versionchanged:: 3.7
+      Dict values in the result are now normal dicts.  You no longer can use
+      attribute access to access items of these dictionaries.
+
 
 .. function:: writePlistToBytes(rootObject)
 
@@ -174,18 +170,6 @@ The following functions are deprecated:
 
 The following classes are available:
 
-.. class:: Dict([dict]):
-
-   Return an extended mapping object with the same value as dictionary
-   *dict*.
-
-   This class is a subclass of :class:`dict` where attribute access can
-   be used to access items. That is, ``aDict.key`` is the same as
-   ``aDict['key']`` for getting, setting and deleting items in the mapping.
-
-   .. deprecated:: 3.0
-
-
 .. class:: Data(data)
 
    Return a "data" wrapper object around the bytes object *data*.  This is used
index 8e5ac5246c03105139abdc106c2a3edfb05cd1b6..c305e5a94cbc433be2c97b0112c7f9c7ab6b039c 100644 (file)
@@ -299,6 +299,12 @@ API and Feature Removals
   longer take keyword arguments.  The first argument of :func:`int` can now
   be passes only as positional argument.
 
+* Removed previously deprecated in Python 2.4 classes ``Plist``, ``Dict`` and
+  ``_InternalDict`` in the :mod:`plistlib` module.  Dict values in the result
+  of functions :func:`~plistlib.readPlist` and
+  :func:`~plistlib.readPlistFromBytes` are now normal dicts.  You no longer
+  can use attribute access to access items of these dictionaries.
+
 
 Porting to Python 3.7
 =====================
index 09be5fd369ccf0dbb446451e98ff15c395f385e7..8262fb049e5869bf36e745eaf08faf5875f5aae0 100644 (file)
@@ -47,7 +47,7 @@ Parse Plist example:
 """
 __all__ = [
     "readPlist", "writePlist", "readPlistFromBytes", "writePlistToBytes",
-    "Plist", "Data", "Dict", "InvalidFileException", "FMT_XML", "FMT_BINARY",
+    "Data", "InvalidFileException", "FMT_XML", "FMT_BINARY",
     "load", "dump", "loads", "dumps"
 ]
 
@@ -76,44 +76,6 @@ globals().update(PlistFormat.__members__)
 #
 
 
-class _InternalDict(dict):
-
-    # This class is needed while Dict is scheduled for deprecation:
-    # we only need to warn when a *user* instantiates Dict or when
-    # the "attribute notation for dict keys" is used.
-    __slots__ = ()
-
-    def __getattr__(self, attr):
-        try:
-            value = self[attr]
-        except KeyError:
-            raise AttributeError(attr)
-        warn("Attribute access from plist dicts is deprecated, use d[key] "
-             "notation instead", DeprecationWarning, 2)
-        return value
-
-    def __setattr__(self, attr, value):
-        warn("Attribute access from plist dicts is deprecated, use d[key] "
-             "notation instead", DeprecationWarning, 2)
-        self[attr] = value
-
-    def __delattr__(self, attr):
-        try:
-            del self[attr]
-        except KeyError:
-            raise AttributeError(attr)
-        warn("Attribute access from plist dicts is deprecated, use d[key] "
-             "notation instead", DeprecationWarning, 2)
-
-
-class Dict(_InternalDict):
-
-    def __init__(self, **kwargs):
-        warn("The plistlib.Dict class is deprecated, use builtin dict instead",
-             DeprecationWarning, 2)
-        super().__init__(**kwargs)
-
-
 @contextlib.contextmanager
 def _maybe_open(pathOrFile, mode):
     if isinstance(pathOrFile, str):
@@ -124,31 +86,6 @@ def _maybe_open(pathOrFile, mode):
         yield pathOrFile
 
 
-class Plist(_InternalDict):
-    """This class has been deprecated. Use dump() and load()
-    functions instead, together with regular dict objects.
-    """
-
-    def __init__(self, **kwargs):
-        warn("The Plist class is deprecated, use the load() and "
-             "dump() functions instead", DeprecationWarning, 2)
-        super().__init__(**kwargs)
-
-    @classmethod
-    def fromFile(cls, pathOrFile):
-        """Deprecated. Use the load() function instead."""
-        with _maybe_open(pathOrFile, 'rb') as fp:
-            value = load(fp)
-        plist = cls()
-        plist.update(value)
-        return plist
-
-    def write(self, pathOrFile):
-        """Deprecated. Use the dump() function instead."""
-        with _maybe_open(pathOrFile, 'wb') as fp:
-            dump(self, fp)
-
-
 def readPlist(pathOrFile):
     """
     Read a .plist from a path or file. pathOrFile should either
@@ -160,8 +97,7 @@ def readPlist(pathOrFile):
         DeprecationWarning, 2)
 
     with _maybe_open(pathOrFile, 'rb') as fp:
-        return load(fp, fmt=None, use_builtin_types=False,
-            dict_type=_InternalDict)
+        return load(fp, fmt=None, use_builtin_types=False)
 
 def writePlist(value, pathOrFile):
     """
@@ -184,8 +120,7 @@ def readPlistFromBytes(data):
     """
     warn("The readPlistFromBytes function is deprecated, use loads() instead",
         DeprecationWarning, 2)
-    return load(BytesIO(data), fmt=None, use_builtin_types=False,
-        dict_type=_InternalDict)
+    return load(BytesIO(data), fmt=None, use_builtin_types=False)
 
 
 def writePlistToBytes(value):
index c77a6bf9d03fd385baa58885f2d23255a6c72883..58b885f0228bdb750893ed59dcace6114871604c 100644 (file)
@@ -173,7 +173,6 @@ class TestPlistlib(unittest.TestCase):
         pl = self._create()
         data = plistlib.dumps(pl)
         pl2 = plistlib.loads(data)
-        self.assertNotIsInstance(pl, plistlib._InternalDict)
         self.assertEqual(dict(pl), dict(pl2))
         data2 = plistlib.dumps(pl2)
         self.assertEqual(data, data2)
@@ -454,14 +453,14 @@ class TestPlistlibDeprecated(unittest.TestCase):
                 'data': b'buffer',
             }
         }
-        pl_out = plistlib._InternalDict({
+        pl_out = {
             'key': 42,
-            'sub': plistlib._InternalDict({
+            'sub': {
                 'key': 9,
                 'alt': 'value',
                 'data': plistlib.Data(b'buffer'),
-            })
-        })
+            }
+        }
 
         self.addCleanup(support.unlink, support.TESTFN)
         with self.assertWarns(DeprecationWarning):
@@ -499,10 +498,10 @@ class TestPlistlibDeprecated(unittest.TestCase):
         with self.assertWarns(DeprecationWarning):
             pl2 = plistlib.readPlistFromBytes(data)
 
-        self.assertIsInstance(pl2, plistlib._InternalDict)
-        self.assertEqual(pl2, plistlib._InternalDict(
+        self.assertIsInstance(pl2, dict)
+        self.assertEqual(pl2, dict(
             key=42,
-            sub=plistlib._InternalDict(
+            sub=dict(
                 key=9,
                 alt='value',
                 data=plistlib.Data(b'buffer'),
index 5aaeda0f7fa007daf66cbdf3201a6364a18dfb4e..a874d03cda6e3ba2be5748615a67277cf5fa6d4c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -323,6 +323,11 @@ Extension Modules
 Library
 -------
 
+- bpo-29196: Removed previously deprecated in Python 2.4 classes Plist, Dict
+  and _InternalDict in the plistlib module.  Dict values in the result of
+  functions readPlist() and readPlistFromBytes() are now normal dicts.  You
+  no longer can use attribute access to access items of these dictionaries.
+
 - bpo-9850: The :mod:`macpath` is now deprecated and will be removed
   in Python 3.8.