python-attrs / python-attrs/attrs

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

Open
#1,180 2 comments 1 reaction 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
5.8k
Forks
480
Avg merge
2h 15m
Merged PRs (30d)
2

Description

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)})))

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Run the supplied Python reproducer first to confirm the TypeError. Then read attr/_next_gen.py and attr/_funcs.py, which appear in the traceback, and trace how attrs.asdict handles the set of Foo instances. Done means attrs.asdict(Bar({Foo(3)})) converts successfully without the unhashable-dict failure.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
developer-experience
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.