Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update Lib/dataclasses.py
cache the output of `type(obj)` to avoid computing it 3 times.

Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
  • Loading branch information
kwsp and eendebakpt authored Mar 13, 2023
commit fc6a5a9682d7599366ecc8faf4233af02d8de949
7 changes: 4 additions & 3 deletions Lib/dataclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -1385,14 +1385,15 @@ def _astuple_inner(obj, tuple_factory):
# above).
return type(obj)(_astuple_inner(v, tuple_factory) for v in obj)
elif isinstance(obj, dict):
if hasattr(type(obj), 'default_factory'):
obj_type = type(obj)
if hasattr(obj_type, 'default_factory'):
# obj is a defaultdict, which has a different constructor from
# dict as it requires the default_factory as its first arg.
result = type(obj)(getattr(obj, 'default_factory'))
result = obj_type(getattr(obj, 'default_factory'))
for k, v in obj.items():
result[_astuple_inner(k, tuple_factory)] = _asdict_inner(v, tuple_factory)
Comment thread
kwsp marked this conversation as resolved.
Outdated
return result
return type(obj)((_astuple_inner(k, tuple_factory), _astuple_inner(v, tuple_factory))
return obj_type((_astuple_inner(k, tuple_factory), _astuple_inner(v, tuple_factory))
for k, v in obj.items())
else:
return copy.deepcopy(obj)
Expand Down