mirror of
https://github.com/python/cpython.git
synced 2025-12-10 11:00:14 +00:00
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.
This commit is contained in:
parent
d812eb731d
commit
edef358ed6
5 changed files with 29 additions and 100 deletions
|
|
@ -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:
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
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
|
||||||
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:
|
||||||
"""
|
"""
|
||||||
__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__)
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
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):
|
||||||
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):
|
||||||
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):
|
||||||
"""
|
"""
|
||||||
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):
|
||||||
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):
|
||||||
'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):
|
||||||
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
|
||||||
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.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue