bpo-35864: Replace OrderedDict with regular dict in namedtuple() (#11708)

* Change from OrderedDict to a regular dict

* Add blurb
This commit is contained in:
Raymond Hettinger 2019-01-31 00:59:50 -08:00 committed by GitHub
parent 0897e0c597
commit 0bb4bdf0d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 2 deletions

View File

@ -894,11 +894,18 @@ field names, the method and attribute names start with an underscore.
>>> p = Point(x=11, y=22)
>>> p._asdict()
OrderedDict([('x', 11), ('y', 22)])
{'x': 11, 'y': 22}
.. versionchanged:: 3.1
Returns an :class:`OrderedDict` instead of a regular :class:`dict`.
.. versionchanged:: 3.8
Returns a regular :class:`dict` instead of an :class:`OrderedDict`.
As of Python 3.7, regular dicts are guaranteed to be ordered. If the
extra features of :class:`OrderedDict` are required, the suggested
remediation is to cast the result to the desired type:
``OrderedDict(nt._asdict())``.
.. method:: somenamedtuple._replace(**kwargs)
Return a new instance of the named tuple replacing specified fields with new

View File

@ -125,6 +125,14 @@ New Modules
Improved Modules
================
* The :meth:`_asdict()` method for :func:`collections.namedtuple` now returns
a :class:`dict` instead of a :class:`collections.OrderedDict`. This works because
regular dicts have guaranteed ordering in since Python 3.7. If the extra
features of :class:`OrderedDict` are required, the suggested remediation is
to cast the result to the desired type: ``OrderedDict(nt._asdict())``.
(Contributed by Raymond Hettinger in :issue:`35864`.)
asyncio
-------

View File

@ -426,9 +426,11 @@ def namedtuple(typename, field_names, *, rename=False, defaults=None, module=Non
'Return a nicely formatted representation string'
return self.__class__.__name__ + repr_fmt % self
_dict, _zip = dict, zip
def _asdict(self):
'Return a new OrderedDict which maps field names to their values.'
return OrderedDict(zip(self._fields, self))
return _dict(_zip(self._fields, self))
def __getnewargs__(self):
'Return self as a plain tuple. Used by copy and pickle.'

View File

@ -0,0 +1,2 @@
The _asdict() method for collections.namedtuple now returns a regular dict
instead of an OrderedDict.