Skip to content

Commit

Permalink
gh-103000: Optimise dataclasses.asdict for the common case (#104364)
Browse files Browse the repository at this point in the history
Co-authored-by: David Ellis <ducksual@gmail.com>
  • Loading branch information
AlexWaygood and DavidCEllis committed May 10, 2023
1 parent e464ec9 commit 7b8d7f5
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
17 changes: 12 additions & 5 deletions Lib/dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -1324,11 +1324,18 @@ def _asdict_inner(obj, dict_factory):
if type(obj) in _ATOMIC_TYPES:
return obj
elif _is_dataclass_instance(obj):
result = []
for f in fields(obj):
value = _asdict_inner(getattr(obj, f.name), dict_factory)
result.append((f.name, value))
return dict_factory(result)
# fast path for the common case
if dict_factory is dict:
return {
f.name: _asdict_inner(getattr(obj, f.name), dict)
for f in fields(obj)
}
else:
result = []
for f in fields(obj):
value = _asdict_inner(getattr(obj, f.name), dict_factory)
result.append((f.name, value))
return dict_factory(result)
elif isinstance(obj, tuple) and hasattr(obj, '_fields'):
# obj is a namedtuple. Recurse into it, but the returned
# object is another namedtuple of the same type. This is
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Improve performance of :func:`dataclasses.asdict` for the common case where
*dict_factory* is ``dict``. Patch by David C Ellis.

0 comments on commit 7b8d7f5

Please sign in to comment.