Skip to content

Commit 870b5bb

Browse files
committed
Move exclude logic to improve performance
This makes encoding of dataclasses that contain large excluded lists much faster.
1 parent 3dc59e0 commit 870b5bb

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

dataclasses_json/core.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,6 @@ def _encode_overrides(kvs, overrides, encode_json=False):
9797
override_kvs = {}
9898
for k, v in kvs.items():
9999
if k in overrides:
100-
exclude = overrides[k].exclude
101-
# If the exclude predicate returns true, the key should be
102-
# excluded from encoding, so skip the rest of the loop
103-
if exclude and exclude(v):
104-
continue
105100
letter_case = overrides[k].letter_case
106101
original_key = k
107102
k = letter_case(k) if letter_case is not None else k
@@ -318,14 +313,22 @@ def _asdict(obj, encode_json=False):
318313
source) to support arbitrary Collection and Mapping types.
319314
"""
320315
if _is_dataclass_instance(obj):
316+
overrides = _user_overrides_or_exts(obj)
321317
result = []
322318
for field in fields(obj):
323-
value = _asdict(getattr(obj, field.name), encode_json=encode_json)
319+
value = getattr(obj, field.name)
320+
exclude = overrides[field.name].exclude
321+
# If the exclude predicate returns true, the key should be
322+
# excluded from encoding, so skip the rest of the loop
323+
if exclude and exclude(value):
324+
continue
325+
326+
value = _asdict(value, encode_json=encode_json)
324327
result.append((field.name, value))
325328

326329
result = _handle_undefined_parameters_safe(cls=obj, kvs=dict(result),
327330
usage="to")
328-
return _encode_overrides(dict(result), _user_overrides_or_exts(obj),
331+
return _encode_overrides(dict(result), overrides,
329332
encode_json=encode_json)
330333
elif isinstance(obj, Mapping):
331334
return dict((_asdict(k, encode_json=encode_json),

0 commit comments

Comments
 (0)