diff -r 20f18e5e8bfc Doc/library/plistlib.rst --- a/Doc/library/plistlib.rst Sat Jan 07 00:08:29 2017 +0100 +++ b/Doc/library/plistlib.rst Sat Jan 07 18:49:41 2017 +0200 @@ -133,13 +133,10 @@ The following functions are deprecated: This function calls :func:`load` to do the actual work, see the documentation of :func:`that function ` for an explanation of the keyword arguments. - .. note:: + .. deprecated:: 3.4 Use :func:`load` instead. - 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 exact dicts. .. function:: writePlist(rootObject, pathOrFile) @@ -156,13 +153,10 @@ The following functions are deprecated: See :func:`load` for a description of the keyword arguments. - .. note:: + .. deprecated:: 3.4 Use :func:`loads` instead. - 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 exact dicts. .. function:: writePlistToBytes(rootObject) @@ -174,18 +168,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 diff -r 20f18e5e8bfc Lib/plistlib.py --- a/Lib/plistlib.py Sat Jan 07 00:08:29 2017 +0100 +++ b/Lib/plistlib.py Sat Jan 07 18:49:41 2017 +0200 @@ -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): diff -r 20f18e5e8bfc Lib/test/test_plistlib.py --- a/Lib/test/test_plistlib.py Sat Jan 07 00:08:29 2017 +0100 +++ b/Lib/test/test_plistlib.py Sat Jan 07 18:49:41 2017 +0200 @@ -173,7 +173,7 @@ class TestPlistlib(unittest.TestCase): pl = self._create() data = plistlib.dumps(pl) pl2 = plistlib.loads(data) - self.assertNotIsInstance(pl, plistlib._InternalDict) + self.assertEqual(pl, pl2) self.assertEqual(dict(pl), dict(pl2)) data2 = plistlib.dumps(pl2) self.assertEqual(data, data2) @@ -454,14 +454,14 @@ class TestPlistlibDeprecated(unittest.Te '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 +499,10 @@ class TestPlistlibDeprecated(unittest.Te 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'),