Skip to content

Cattrs serializer is not round-trip safe for type B | X (B is a built-in type) when value is not type B #656

@ngchihuan

Description

@ngchihuan

cattrs version: 24.1.3

Hi cattrs team,
The round-trip serialization of a union type in the following case is not guaranteed.
It is clearly stated in the manual that built-in types are passed through during the serialization. However, the structuring with the same type hint fails.
It seems to contradict the intuition that round-trip serialization of the same type should be invertible.

I am aware of the workaround of customizing either the restructuring or structuring for the built-in types.
But it also seems to me that these can be handled internally by cattrs.

Thanks a lot.

@attrs.define
class B:
    b: int

c = make_converter()
c.structure(c.unstructure(1, float|  B), float | B)
# where float can be substituted by any built-in types.

Error:

  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "<cattrs generated structure __main__.B>", line 5, in structure_B
    |     res['b'] = __c_structure_b(o['b'])
    | TypeError: 'int' object is not subscriptable
    | Structuring class B @ attribute b
    +------------------------------------

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions