attrs icon indicating copy to clipboard operation
attrs copied to clipboard

attr.asdict -> attrs.asdict regression for sets of instances

Open jgarvin opened this issue 2 years ago • 2 comments

Hard coding retain_collection_types=True in attrs.asdict means that you can no longer convert objects that contain sets of other objects. Reproducer:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import attr
import attrs
from attrs import frozen

@frozen
class Foo:
    x: int

@frozen
class Bar:
    foos: set[Foo]

# works!
print(attr.asdict(Bar({Foo(3)})))

# fails with:
# Traceback (most recent call last):
#   File "/tmp/regression.py", line 16, in <module>
#     print(attrs.asdict(Bar({Foo(3)})))
#           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
#   File "/home/x/.local/lib/python3.11/site-packages/attr/_next_gen.py", line 214, in asdict
#     return _asdict(
#            ^^^^^^^^
#   File "/home/x/.local/lib/python3.11/site-packages/attr/_funcs.py", line 75, in asdict
#     rv[a.name] = cf(
#                  ^^^
# TypeError: unhashable type: 'dict'
print(attrs.asdict(Bar({Foo(3)})))

jgarvin avatar Aug 25 '23 23:08 jgarvin

To clarify: you're asking to get the knob back?

hynek avatar Dec 29 '23 15:12 hynek

Really what I'm asking for is to be able to have an object that contains a set of other objects and still have asdict work, whether that's by putting the knob back or some other means. In a perfect world it would Just Work (TM) with no special options needed :)

jgarvin avatar Dec 31 '23 22:12 jgarvin