desert icon indicating copy to clipboard operation
desert copied to clipboard

An Optional type expects 1 subtype

Open ruaridhw opened this issue 3 years ago • 3 comments

desert throws an error when a dataclass has more than one subtype other than None

import desert
from dataclasses import dataclass
from typing import Union

from marshmallow import Schema

@dataclass
class MyOptionalKlass:
    a: Union[float, str, None] = 3

schema = desert.schema(MyOptionalKlass)
#> ValueError: too many values to unpack (expected 1)

I think this is to do with the check of is_optional_type() before is_union_type(). I think within the is_optional_type() branch we should create subfields for all remaining subtypes other than NoneType.

Even without the None in the type, the default value of the field is still <marshmallow.missing> rather than 3

ruaridhw avatar Apr 22 '21 15:04 ruaridhw

I think this is basically a lead in to https://github.com/python-desert/desert/issues/36. Perhaps a simpler 'handle the basic types only' solution could be useful. Or perhaps it is better as a trivial recipe for the general solution. For example, would a JSON true become 1 or 'True' (or 'true') or be rejected?

altendky avatar May 19 '21 15:05 altendky

Also encountering the same when using Optional as part of the type hint:

from dataclasses import dataclass
from typing import List, Optional, Union

import desert


@dataclass
class ExplicitlyOptionalClass:
    x: Optional[Union[str, List[str]]] = None


s = desert.schema(ExplicitlyOptionalClass)
# > ValueError: too many values to unpack (expected 1)

which is causing a conflict with our mypy settings of not having implicit Optionals.

JMMarchant avatar Sep 09 '21 16:09 JMMarchant

I'm still running into this with the latest version (2020.11.18).

dargueta avatar Feb 20 '23 17:02 dargueta