From edef358ed6d05f927bf1636cc5a920a9d868b131 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Mon, 15 May 2017 13:21:31 +0300 Subject: [PATCH] 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. --- Doc/library/plistlib.rst | 32 +++++------------- Doc/whatsnew/3.7.rst | 6 ++++ Lib/plistlib.py | 71 ++------------------------------------- Lib/test/test_plistlib.py | 15 ++++----- Misc/NEWS | 5 +++ 5 files changed, 29 insertions(+), 100 deletions(-) diff --git a/Doc/library/plistlib.rst b/Doc/library/plistlib.rst index 9ba226607d..7d306a2bca 100644 --- a/Doc/library/plistlib.rst +++ b/Doc/library/plistlib.rst @@ -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 ` 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 diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 8e5ac5246c..c305e5a94c 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -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 ===================== diff --git a/Lib/plistlib.py b/Lib/plistlib.py index 09be5fd369..8262fb049e 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -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 --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index c77a6bf9d0..58b885f022 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -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'), diff --git a/Misc/NEWS b/Misc/NEWS index 5aaeda0f7f..a874d03cda 100644 --- 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. -- 2.40.0