From: Eric V. Smith <ericvsmith@users.noreply.github.com> Date: Sun, 7 Jan 2018 19:30:17 +0000 (-0500) Subject: bpo-32506: Change dataclasses from OrderedDict to plain dict. (gh-5131) X-Git-Tag: v3.7.0a4~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d13889214a4c81b78fa8683d35bdbd17ff22f4fe;p=python bpo-32506: Change dataclasses from OrderedDict to plain dict. (gh-5131) --- diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 9e186c3c7b..d80054920c 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -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 index 0000000000..e524769c6d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-01-07-11-32-42.bpo-32506.MaT-zU.rst @@ -0,0 +1,2 @@ +Now that dict is defined as keeping insertion order, drop OrderedDict and +just use plain dict.