Kaydet (Commit) edef358e authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka Kaydeden (comit) GitHub

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.
üst d812eb73
...@@ -133,14 +133,12 @@ The following functions are deprecated: ...@@ -133,14 +133,12 @@ The following functions are deprecated:
This function calls :func:`load` to do the actual work, see the documentation 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. 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. .. 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) .. function:: writePlist(rootObject, pathOrFile)
...@@ -156,14 +154,12 @@ The following functions are deprecated: ...@@ -156,14 +154,12 @@ The following functions are deprecated:
See :func:`load` for a description of the keyword arguments. 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. .. 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) .. function:: writePlistToBytes(rootObject)
...@@ -174,18 +170,6 @@ The following functions are deprecated: ...@@ -174,18 +170,6 @@ The following functions are deprecated:
The following classes are available: 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) .. class:: Data(data)
Return a "data" wrapper object around the bytes object *data*. This is used Return a "data" wrapper object around the bytes object *data*. This is used
......
...@@ -299,6 +299,12 @@ API and Feature Removals ...@@ -299,6 +299,12 @@ API and Feature Removals
longer take keyword arguments. The first argument of :func:`int` can now longer take keyword arguments. The first argument of :func:`int` can now
be passes only as positional argument. 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 Porting to Python 3.7
===================== =====================
......
...@@ -47,7 +47,7 @@ Parse Plist example: ...@@ -47,7 +47,7 @@ Parse Plist example:
""" """
__all__ = [ __all__ = [
"readPlist", "writePlist", "readPlistFromBytes", "writePlistToBytes", "readPlist", "writePlist", "readPlistFromBytes", "writePlistToBytes",
"Plist", "Data", "Dict", "InvalidFileException", "FMT_XML", "FMT_BINARY", "Data", "InvalidFileException", "FMT_XML", "FMT_BINARY",
"load", "dump", "loads", "dumps" "load", "dump", "loads", "dumps"
] ]
...@@ -76,44 +76,6 @@ globals().update(PlistFormat.__members__) ...@@ -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 @contextlib.contextmanager
def _maybe_open(pathOrFile, mode): def _maybe_open(pathOrFile, mode):
if isinstance(pathOrFile, str): if isinstance(pathOrFile, str):
...@@ -124,31 +86,6 @@ def _maybe_open(pathOrFile, mode): ...@@ -124,31 +86,6 @@ def _maybe_open(pathOrFile, mode):
yield pathOrFile 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): def readPlist(pathOrFile):
""" """
Read a .plist from a path or file. pathOrFile should either Read a .plist from a path or file. pathOrFile should either
...@@ -160,8 +97,7 @@ def readPlist(pathOrFile): ...@@ -160,8 +97,7 @@ def readPlist(pathOrFile):
DeprecationWarning, 2) DeprecationWarning, 2)
with _maybe_open(pathOrFile, 'rb') as fp: with _maybe_open(pathOrFile, 'rb') as fp:
return load(fp, fmt=None, use_builtin_types=False, return load(fp, fmt=None, use_builtin_types=False)
dict_type=_InternalDict)
def writePlist(value, pathOrFile): def writePlist(value, pathOrFile):
""" """
...@@ -184,8 +120,7 @@ def readPlistFromBytes(data): ...@@ -184,8 +120,7 @@ def readPlistFromBytes(data):
""" """
warn("The readPlistFromBytes function is deprecated, use loads() instead", warn("The readPlistFromBytes function is deprecated, use loads() instead",
DeprecationWarning, 2) DeprecationWarning, 2)
return load(BytesIO(data), fmt=None, use_builtin_types=False, return load(BytesIO(data), fmt=None, use_builtin_types=False)
dict_type=_InternalDict)
def writePlistToBytes(value): def writePlistToBytes(value):
......
...@@ -173,7 +173,6 @@ class TestPlistlib(unittest.TestCase): ...@@ -173,7 +173,6 @@ class TestPlistlib(unittest.TestCase):
pl = self._create() pl = self._create()
data = plistlib.dumps(pl) data = plistlib.dumps(pl)
pl2 = plistlib.loads(data) pl2 = plistlib.loads(data)
self.assertNotIsInstance(pl, plistlib._InternalDict)
self.assertEqual(dict(pl), dict(pl2)) self.assertEqual(dict(pl), dict(pl2))
data2 = plistlib.dumps(pl2) data2 = plistlib.dumps(pl2)
self.assertEqual(data, data2) self.assertEqual(data, data2)
...@@ -454,14 +453,14 @@ class TestPlistlibDeprecated(unittest.TestCase): ...@@ -454,14 +453,14 @@ class TestPlistlibDeprecated(unittest.TestCase):
'data': b'buffer', 'data': b'buffer',
} }
} }
pl_out = plistlib._InternalDict({ pl_out = {
'key': 42, 'key': 42,
'sub': plistlib._InternalDict({ 'sub': {
'key': 9, 'key': 9,
'alt': 'value', 'alt': 'value',
'data': plistlib.Data(b'buffer'), 'data': plistlib.Data(b'buffer'),
}) }
}) }
self.addCleanup(support.unlink, support.TESTFN) self.addCleanup(support.unlink, support.TESTFN)
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
...@@ -499,10 +498,10 @@ class TestPlistlibDeprecated(unittest.TestCase): ...@@ -499,10 +498,10 @@ class TestPlistlibDeprecated(unittest.TestCase):
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
pl2 = plistlib.readPlistFromBytes(data) pl2 = plistlib.readPlistFromBytes(data)
self.assertIsInstance(pl2, plistlib._InternalDict) self.assertIsInstance(pl2, dict)
self.assertEqual(pl2, plistlib._InternalDict( self.assertEqual(pl2, dict(
key=42, key=42,
sub=plistlib._InternalDict( sub=dict(
key=9, key=9,
alt='value', alt='value',
data=plistlib.Data(b'buffer'), data=plistlib.Data(b'buffer'),
......
...@@ -323,6 +323,11 @@ Extension Modules ...@@ -323,6 +323,11 @@ Extension Modules
Library 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 - bpo-9850: The :mod:`macpath` is now deprecated and will be removed
in Python 3.8. in Python 3.8.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment