desert
desert copied to clipboard
An Optional type expects 1 subtype
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
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?
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
.
I'm still running into this with the latest version (2020.11.18).