Skip to content

Nested class structure #542

@csqzhang

Description

@csqzhang
  • cattrs version: cattrs==23.2.3
  • Python version: python=3.11.2
  • Operating System: OSX/Linux

Description

I want to use cattrs to (un)strcuture classes.

What I Did

import cattr
import attr
from cattrs.strategies import configure_tagged_union, include_subclasses

@attr.s(frozen=True, auto_attribs=True)
class A:
    pass


@attr.s(frozen=True, auto_attribs=True)
class B1(A):
    b: str


@attr.s(frozen=True, auto_attribs=True)
class B2(A):
    b: str
    a: A


CONVERTER = cattr.Converter()
union_strategy = partial(configure_tagged_union, tag_name="type_name")
include_subclasses(A, CONVERTER, union_strategy=union_strategy)


if __name__ == "__main__":
    instance = B1(b="1")
    r = CONVERTER.unstructure(instance)
    CONVERTER.structure(r, A)
    instance2 = B2(b="2", a=B1(b="1"))
    r2 = CONVERTER.unstructure(instance2)
    CONVERTER.structure(r2, A)

In the example above, we can (un)structure a B1 instance (e.g. instance) correctly. However, for a B2 instance (e.g. instance2), I can see catter unstructure it correctly, r2 looks correctly. However, I got B2(b='2', a=A()) back when I structure the r2 as A, which does not equal to the original instance2.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions