42
42
_T = typing .TypeVar ("_T" )
43
43
44
44
45
- def _get_fields (attrs , ordered = False ):
46
- """Get fields from a class. If ordered=True, fields will sorted by creation index.
45
+ def _get_fields (attrs ):
46
+ """Get fields from a class
47
47
48
48
:param attrs: Mapping of class attributes
49
- :param bool ordered: Sort fields by creation index
50
49
"""
51
- fields = [
50
+ return [
52
51
(field_name , field_value )
53
52
for field_name , field_value in attrs .items ()
54
53
if is_instance_or_subclass (field_value , base .FieldABC )
55
54
]
56
- if ordered :
57
- fields .sort (key = lambda pair : pair [1 ]._creation_index )
58
- return fields
59
55
60
56
61
57
# This function allows Schemas to inherit from non-Schema classes and ensures
62
58
# inheritance according to the MRO
63
- def _get_fields_by_mro (klass , ordered = False ):
59
+ def _get_fields_by_mro (klass ):
64
60
"""Collect fields from a class, following its method resolution order. The
65
61
class itself is excluded from the search; only its parents are checked. Get
66
62
fields from ``_declared_fields`` if available, else use ``__dict__``.
@@ -73,7 +69,6 @@ class itself is excluded from the search; only its parents are checked. Get
73
69
(
74
70
_get_fields (
75
71
getattr (base , "_declared_fields" , base .__dict__ ),
76
- ordered = ordered ,
77
72
)
78
73
for base in mro [:0 :- 1 ]
79
74
),
@@ -102,13 +97,13 @@ def __new__(mcs, name, bases, attrs):
102
97
break
103
98
else :
104
99
ordered = False
105
- cls_fields = _get_fields (attrs , ordered = ordered )
100
+ cls_fields = _get_fields (attrs )
106
101
# Remove fields from list of class attributes to avoid shadowing
107
102
# Schema attributes/methods in case of name conflict
108
103
for field_name , _ in cls_fields :
109
104
del attrs [field_name ]
110
105
klass = super ().__new__ (mcs , name , bases , attrs )
111
- inherited_fields = _get_fields_by_mro (klass , ordered = ordered )
106
+ inherited_fields = _get_fields_by_mro (klass )
112
107
113
108
meta = klass .Meta
114
109
# Set klass.opts in __new__ rather than __init__ so that it is accessible in
@@ -117,13 +112,11 @@ def __new__(mcs, name, bases, attrs):
117
112
# Add fields specified in the `include` class Meta option
118
113
cls_fields += list (klass .opts .include .items ())
119
114
120
- dict_cls = OrderedDict if ordered else dict
121
115
# Assign _declared_fields on class
122
116
klass ._declared_fields = mcs .get_declared_fields (
123
117
klass = klass ,
124
118
cls_fields = cls_fields ,
125
119
inherited_fields = inherited_fields ,
126
- dict_cls = dict_cls ,
127
120
)
128
121
return klass
129
122
@@ -133,7 +126,7 @@ def get_declared_fields(
133
126
klass : type ,
134
127
cls_fields : list ,
135
128
inherited_fields : list ,
136
- dict_cls : type ,
129
+ dict_cls : type = dict ,
137
130
):
138
131
"""Returns a dictionary of field_name => `Field` pairs declared on the class.
139
132
This is exposed mainly so that plugins can add additional fields, e.g. fields
@@ -143,8 +136,7 @@ def get_declared_fields(
143
136
:param cls_fields: The fields declared on the class, including those added
144
137
by the ``include`` class Meta option.
145
138
:param inherited_fields: Inherited fields.
146
- :param dict_cls: Either `dict` or `OrderedDict`, depending on whether
147
- the user specified `ordered=True`.
139
+ :param dict_cls: dict-like class to use for dict output Default to ``dict``.
148
140
"""
149
141
return dict_cls (inherited_fields + cls_fields )
150
142
@@ -319,6 +311,8 @@ class AlbumSchema(Schema):
319
311
320
312
OPTIONS_CLASS = SchemaOpts # type: type
321
313
314
+ set_class = OrderedSet
315
+
322
316
# These get set by SchemaMeta
323
317
opts = None # type: SchemaOpts
324
318
_declared_fields = {} # type: typing.Dict[str, ma_fields.Field]
@@ -350,9 +344,7 @@ class Meta:
350
344
- ``timeformat``: Default format for `Time <fields.Time>` fields.
351
345
- ``render_module``: Module to use for `loads <Schema.loads>` and `dumps <Schema.dumps>`.
352
346
Defaults to `json` from the standard library.
353
- - ``ordered``: If `True`, order serialization output according to the
354
- order in which fields were declared. Output of `Schema.dump` will be a
355
- `collections.OrderedDict`.
347
+ - ``ordered``: If `True`, output of `Schema.dump` will be a `collections.OrderedDict`.
356
348
- ``index_errors``: If `True`, errors dictionaries will include the index
357
349
of invalid items in a collection.
358
350
- ``load_only``: Tuple or list of fields to exclude from serialized results.
@@ -386,7 +378,9 @@ def __init__(
386
378
self .declared_fields = copy .deepcopy (self ._declared_fields )
387
379
self .many = many
388
380
self .only = only
389
- self .exclude = set (self .opts .exclude ) | set (exclude )
381
+ self .exclude : set [typing .Any ] | typing .MutableSet [typing .Any ] = set (
382
+ self .opts .exclude
383
+ ) | set (exclude )
390
384
self .ordered = self .opts .ordered
391
385
self .load_only = set (load_only ) or set (self .opts .load_only )
392
386
self .dump_only = set (dump_only ) or set (self .opts .dump_only )
@@ -419,10 +413,6 @@ def __repr__(self) -> str:
419
413
def dict_class (self ) -> type :
420
414
return OrderedDict if self .ordered else dict
421
415
422
- @property
423
- def set_class (self ) -> type :
424
- return OrderedSet if self .ordered else set
425
-
426
416
@classmethod
427
417
def from_dict (
428
418
cls ,
@@ -970,7 +960,7 @@ def _init_fields(self) -> None:
970
960
971
961
if self .only is not None :
972
962
# Return only fields specified in only option
973
- field_names = self .set_class (self .only )
963
+ field_names : typing . AbstractSet [ typing . Any ] = self .set_class (self .only )
974
964
975
965
invalid_fields |= field_names - available_field_names
976
966
else :
0 commit comments