Ejemplo n.º 1
0
def _build_value_for_union(union: Type, data: Any, config: Config) -> Any:
    types = extract_generic(union)
    if is_optional(union) and len(types) == 2:
        return _build_value(type_=types[0], data=data, config=config)
    union_matches = {}
    for inner_type in types:
        try:
            # noinspection PyBroadException
            try:
                data = transform_value(type_hooks=config.type_hooks,
                                       cast=config.cast,
                                       target_type=inner_type,
                                       value=data)
            except Exception:  # pylint: disable=broad-except
                continue
            value = _build_value(type_=inner_type, data=data, config=config)
            if is_instance(value, inner_type):
                if config.strict_unions_match:
                    union_matches[inner_type] = value
                else:
                    return value
        except DaciteError:
            pass
    if config.strict_unions_match:
        if len(union_matches) > 1:
            raise StrictUnionMatchError(union_matches)
        return union_matches.popitem()[1]
    if not config.check_types:
        return data
    raise UnionMatchError(field_type=union, value=data)
Ejemplo n.º 2
0
def get_default_value_for_field(field: Field) -> Any:
    if field.default != MISSING:
        return field.default
    elif field.default_factory != MISSING:  # type: ignore
        return field.default_factory()  # type: ignore
    elif is_optional(field.type):
        return None
    raise DefaultValueNotFoundError()
Ejemplo n.º 3
0
def _build_value_for_union(union: Type, data: Any, config: Config) -> Any:
    types = extract_generic(union)
    if is_optional(union) and len(types) == 2:
        return _build_value(type_=types[0], data=data, config=config)
    for inner_type in types:
        try:
            value = _build_value(type_=inner_type, data=data, config=config)
            if is_instance(value, inner_type):
                return value
        except DaciteError:
            pass
    if not config.check_types:
        return data
    raise UnionMatchError(field_type=union, value=data)
Ejemplo n.º 4
0
def test_is_optional_with_optional_of_union():
    assert is_optional(Optional[Union[int, float]])
Ejemplo n.º 5
0
def test_is_optional_with_non_optional():
    assert not is_optional(int)
Ejemplo n.º 6
0
def test_is_optional_with_optional():
    assert is_optional(Optional[int])
Ejemplo n.º 7
0
def has_field_default_value(field: Field) -> bool:
    return field.default != MISSING or field.default_factory != MISSING or is_optional(field.type)  # type: ignore