Skip to content

JsonConverter.structure cannot handle Annotated union type. #418

@declaresub

Description

@declaresub
  • cattrs version: 23.1.2
  • Python version: 3.11.4
  • Operating System: Mac OS 13.4.1 (c)

Description

cattrs fails when attempting to structure data using a class with an Annotated union type.

What I Did

The code:

from typing import Annotated
import attrs
from cattrs.preconf.json import make_converter

conv = make_converter()

@attrs.define
class GoodModel:
    name: Annotated[str, 'required']
    
@attrs.define
class BadModel:
    name: Annotated[str | None, 'required'] 

data = {'name': 'test'}
print('Loading data using GoodModel.')
conv.structure(data, GoodModel)
print('Loading data using GoodModel succeeded.')
print('Loading data using BadModel.')
conv.structure(data, BadModel)

and the output:

Loading data using GoodModel.
Loading data using GoodModel succeeded.
Loading data using BadModel.
  + Exception Group Traceback (most recent call last):
  |   File "/Users/charles/Documents/annotated_test.py", line 20, in <module>
  |     conv.structure(data, BadModel)
  |   File "/Users/charles/Documents/ccWrangler/git/ccwrangler-api/.venv/3.11.4/lib/python3.11/site-packages/cattrs/converters.py", line 334, in structure
  |     return self._structure_func.dispatch(cl)(obj, cl)
  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |   File "<cattrs generated structure __main__.BadModel>", line 9, in structure_BadModel
  | cattrs.errors.ClassValidationError: While structuring BadModel (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "<cattrs generated structure __main__.BadModel>", line 5, in structure_BadModel
    |   File "/Users/charles/Documents/ccWrangler/git/ccwrangler-api/.venv/3.11.4/lib/python3.11/site-packages/cattrs/converters.py", line 646, in _structure_optional
    |     other = union_params[0] if union_params[1] is NoneType else union_params[1]
    |                                ~~~~~~~~~~~~^^^
    | IndexError: tuple index out of range
    | Structuring class BadModel @ attribute name

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