]> granicus.if.org Git - python/commitdiff
bpo-35864: Replace OrderedDict with regular dict in namedtuple() (#11708)
authorRaymond Hettinger <rhettinger@users.noreply.github.com>
Thu, 31 Jan 2019 08:59:50 +0000 (00:59 -0800)
committerGitHub <noreply@github.com>
Thu, 31 Jan 2019 08:59:50 +0000 (00:59 -0800)
* Change from OrderedDict to a regular dict

* Add blurb

Doc/library/collections.rst
Doc/whatsnew/3.8.rst
Lib/collections/__init__.py
Misc/NEWS.d/next/Library/2019-01-30-20-22-36.bpo-35864.ig9KnG.rst [new file with mode: 0644]

index bfbf8a7ecc070c8e0c7dd00edcf87d7d18ca814e..3fa8b32ff006f53deb98f1758ed4e38b4c0f4320 100644 (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
index fb25ce2f7669e9d554f058f9fc0c4fabae72aee5..09c43b1f30a5a0d1ac3ed2060d9c1008860ecbdc 100644 (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
 -------
 
index c31d7b79185d6f9551d22dc5301f14c218723d50..835cc363d10ad446db829f63825eb5657529ff46 100644 (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.'
diff --git a/Misc/NEWS.d/next/Library/2019-01-30-20-22-36.bpo-35864.ig9KnG.rst b/Misc/NEWS.d/next/Library/2019-01-30-20-22-36.bpo-35864.ig9KnG.rst
new file mode 100644 (file)
index 0000000..e3b41b7
--- /dev/null
@@ -0,0 +1,2 @@
+The _asdict() method for collections.namedtuple now returns a regular dict
+instead of an OrderedDict.