]> granicus.if.org Git - python/commitdiff
bpo-32506: Change dataclasses from OrderedDict to plain dict. (gh-5131)
authorEric V. Smith <ericvsmith@users.noreply.github.com>
Sun, 7 Jan 2018 19:30:17 +0000 (14:30 -0500)
committerGitHub <noreply@github.com>
Sun, 7 Jan 2018 19:30:17 +0000 (14:30 -0500)
Lib/dataclasses.py
Misc/NEWS.d/next/Library/2018-01-07-11-32-42.bpo-32506.MaT-zU.rst [new file with mode: 0644]

index 9e186c3c7b7351bcda5eb28cb9198f1b8325f52a..d80054920ce0002541a16744d2176020f232d330 100644 (file)
@@ -1,7 +1,6 @@
 import sys
 import types
 from copy import deepcopy
-import collections
 import inspect
 
 __all__ = ['dataclass',
@@ -448,11 +447,11 @@ def _set_attribute(cls, name, value):
 
 
 def _process_class(cls, repr, eq, order, hash, init, frozen):
-    # Use an OrderedDict because:
-    #  - Order matters!
-    #  - Derived class fields overwrite base class fields, but the
-    #    order is defined by the base class, which is found first.
-    fields = collections.OrderedDict()
+    # Now that dicts retain insertion order, there's no reason to use
+    #  an ordered dict.  I am leveraging that ordering here, because
+    #  derived class fields overwrite base class fields, but the order
+    #  is defined by the base class, which is found first.
+    fields = {}
 
     # Find our base classes in reverse MRO order, and exclude
     #  ourselves.  In reversed order so that more derived classes
@@ -612,7 +611,8 @@ def fields(class_or_instance):
     except AttributeError:
         raise TypeError('must be called with a dataclass type or instance')
 
-    # Exclude pseudo-fields.
+    # Exclude pseudo-fields.  Note that fields is sorted by insertion
+    #  order, so the order of the tuple is as the fields were defined.
     return tuple(f for f in fields.values() if f._field_type is _FIELD)
 
 
@@ -735,7 +735,7 @@ def make_dataclass(cls_name, fields, *, bases=(), namespace=None, init=True,
         # Copy namespace since we're going to mutate it.
         namespace = namespace.copy()
 
-    anns = collections.OrderedDict()
+    anns = {}
     for item in fields:
         if isinstance(item, str):
             name = item
diff --git a/Misc/NEWS.d/next/Library/2018-01-07-11-32-42.bpo-32506.MaT-zU.rst b/Misc/NEWS.d/next/Library/2018-01-07-11-32-42.bpo-32506.MaT-zU.rst
new file mode 100644 (file)
index 0000000..e524769
--- /dev/null
@@ -0,0 +1,2 @@
+Now that dict is defined as keeping insertion order, drop OrderedDict and
+just use plain dict.