Skip to content

class that contains itself not supported #13

@virtuald

Description

@virtuald

Same issue as #11 I expect, but the error message is a lot more cryptic.

import dataclasses
import typing

import validobj.validation

@dataclasses.dataclass
class Foo:
    maybe_has_foo: typing.List["Foo"]


v = {"maybe_has_foo": [{"maybe_has_foo": []}]}
validobj.validation.parse_input(v, Foo)

Results in this error:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    validobj.validation.parse_input(v, Foo)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^
  File "validobj/validation.py", line 491, in parse_input
    return _parse_dataclass(value, spec)
  File "validobj/validation.py", line 220, in _parse_dataclass
    res[k] = parse_input(v, field_dict[k])
             ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
  File "validobj/validation.py", line 503, in parse_input
    return _handle_typing_spec(value, spec)
  File "validobj/validation.py", line 361, in _handle_typing_spec
    return _parse_homogeneous_typying_collection(value, spec.__origin__, inner)
  File "validobj/validation.py", line 111, in _parse_homogeneous_typying_collection
    res.append(parse_input(item, inner))
               ~~~~~~~~~~~^^^^^^^^^^^^^
  File "validobj/validation.py", line 464, in parse_input
    return parse_input(value, spec[0])
  File "validobj/validation.py", line 510, in parse_input
    if isinstance(value, spec):
       ~~~~~~~~~~^^^^^^^^^^^^^
TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union

Spec is a ForwardRef object, which isn't supported. You can work around this, but it's ugly:

import dataclasses
import typing

import validobj.validation


class Foo:
    maybe_has_foo: typing.List["Foo"]

Foo.__annotations__["maybe_has_foo"] = typing.List[Foo]
Foo = dataclasses.dataclass(Foo)


v = {"maybe_has_foo": [{"maybe_has_foo": []}]}
validobj.validation.parse_input(v, Foo)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions