New submission from Will T <timwillo...@gmail.com>:

_asdict_inner attempts to manually recursively deepcopy dicts by calling 
type(obj) with a generator of transformed keyvalue tuples @ 
https://github.com/python/cpython/blob/b2f642ccd2f65d2f3bf77bbaa103dd2bc2733734/Lib/dataclasses.py#L1080
 . defaultdicts are dicts so this runs but unlike other dicts their first arg 
has to be a callable or None:

    import collections
    import dataclasses as dc

    @dc.dataclass()
    class C:
        d: dict

    c = C(collections.defaultdict(lambda: 3, {}))
    d = dc.asdict(c)

    assert isinstance(d['d'], collections.defaultdict)
    assert d['d']['a'] == 3

=>

    Traceback (most recent call last):
      File "boom.py", line 9, in <module>
        d = dc.asdict(c)
      File 
"/Users/spinlock/.pyenv/versions/3.7.1/lib/python3.7/dataclasses.py", line 
1019, in asdict
        return _asdict_inner(obj, dict_factory)
      File 
"/Users/spinlock/.pyenv/versions/3.7.1/lib/python3.7/dataclasses.py", line 
1026, in _asdict_inner
        value = _asdict_inner(getattr(obj, f.name), dict_factory)
      File 
"/Users/spinlock/.pyenv/versions/3.7.1/lib/python3.7/dataclasses.py", line 
1058, in _asdict_inner
        for k, v in obj.items())
    TypeError: first argument must be callable or None

I understand that it isn't this bit of code's job to support every dict (and 
list etc.) subclass under the sun but given defaultdict is stdlib it's imo 
worth supporting explicitly.

----------
components: Library (Lib)
messages: 332166
nosy: wrmsr
priority: normal
severity: normal
status: open
title: dataclasses.asdict breaks with defaultdict fields
versions: Python 3.7

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue35540>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to