|
1 | 1 | import sys |
2 | 2 | import types |
3 | 3 | from copy import deepcopy |
4 | | -import collections |
5 | 4 | import inspect |
6 | 5 |
|
7 | 6 | __all__ = ['dataclass', |
@@ -448,11 +447,11 @@ def _set_attribute(cls, name, value): |
448 | 447 |
|
449 | 448 |
|
450 | 449 | def _process_class(cls, repr, eq, order, hash, init, frozen): |
451 | | - # Use an OrderedDict because: |
452 | | - # - Order matters! |
453 | | - # - Derived class fields overwrite base class fields, but the |
454 | | - # order is defined by the base class, which is found first. |
455 | | - fields = collections.OrderedDict() |
| 450 | + # Now that dicts retain insertion order, there's no reason to use |
| 451 | + # an ordered dict. I am leveraging that ordering here, because |
| 452 | + # derived class fields overwrite base class fields, but the order |
| 453 | + # is defined by the base class, which is found first. |
| 454 | + fields = {} |
456 | 455 |
|
457 | 456 | # Find our base classes in reverse MRO order, and exclude |
458 | 457 | # ourselves. In reversed order so that more derived classes |
@@ -612,7 +611,8 @@ def fields(class_or_instance): |
612 | 611 | except AttributeError: |
613 | 612 | raise TypeError('must be called with a dataclass type or instance') |
614 | 613 |
|
615 | | - # Exclude pseudo-fields. |
| 614 | + # Exclude pseudo-fields. Note that fields is sorted by insertion |
| 615 | + # order, so the order of the tuple is as the fields were defined. |
616 | 616 | return tuple(f for f in fields.values() if f._field_type is _FIELD) |
617 | 617 |
|
618 | 618 |
|
@@ -735,7 +735,7 @@ class C(Base): |
735 | 735 | # Copy namespace since we're going to mutate it. |
736 | 736 | namespace = namespace.copy() |
737 | 737 |
|
738 | | - anns = collections.OrderedDict() |
| 738 | + anns = {} |
739 | 739 | for item in fields: |
740 | 740 | if isinstance(item, str): |
741 | 741 | name = item |
|
0 commit comments