bpo-29196: Removed old-deprecated classes Plist, Dict and _InternalDict (#488)

in the plistlib module.  Dict values in the result of functions
readPlist() and readPlistFromBytes() are now exact dicts.
diff --git a/Lib/plistlib.py b/Lib/plistlib.py
index 09be5fd..8262fb0 100644
--- a/Lib/plistlib.py
+++ b/Lib/plistlib.py
@@ -47,7 +47,7 @@
 """
 __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 @@
 #
 
 
-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 @@
         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 @@
         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 @@
     """
     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):
diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py
index c77a6bf..58b885f 100644
--- a/Lib/test/test_plistlib.py
+++ b/Lib/test/test_plistlib.py
@@ -173,7 +173,6 @@
         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 @@
                 '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 @@
         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'),