Beispiel #1
0
def dict_isinstance(o, t):
    if t is Dict:
        return isinstance(o, dict)

    key_type, value_type = get_args(t)

    return isinstance(o, dict) and all(
        isinstance(key, key_type) and isinstance(value, value_type)
        for key, value in o.items())
Beispiel #2
0
def noop_deserialization(cls, obj):
    if not isinstance(obj, cls):
        raise DeserializationError(
            "Cannot deserialize {} {!r} to type {}".format(
                type(obj), obj, cls))

    return obj
Beispiel #3
0
def dict_serialization(
    obj,
    key_serialization_func=noop_serialization,
    value_serialization_func=noop_serialization,
):
    if not isinstance(obj, dict):
        raise SerializationError(
            "Cannot serialize {} {!r} using dict serialization".format(
                type(obj), obj))

    return {
        key_serialization_func(key): value_serialization_func(value)
        for key, value in obj.items()
    }
Beispiel #4
0
def list_deserialization(type_,
                         obj,
                         deserialization_func=noop_deserialization):
    if not isinstance(obj, list):
        raise DeserializationError(
            "Cannot deserialize {} {!r} using list deserialization".format(
                type(obj), obj))

    if type_ is list or type_ is List:
        return obj

    (value_type, ) = get_args(type_)

    return [deserialization_func(value_type, value) for value in obj]
Beispiel #5
0
def dict_deserialization(
    type_,
    obj,
    key_deserialization_func=noop_deserialization,
    value_deserialization_func=noop_deserialization,
):
    if not isinstance(obj, dict):
        raise DeserializationError(
            "Cannot deserialize {} {!r} using dict deserialization".format(
                type(obj), obj))

    if type_ is dict or type_ is Dict:
        return obj

    key_type, value_type = get_args(type_)

    return {
        key_deserialization_func(key_type, key):
        value_deserialization_func(value_type, value)
        for key, value in obj.items()
    }
def dict_to_dataclass(cls, dct, deserialization_func=noop_deserialization):
    if not isinstance(dct, dict):
        raise DeserializationError(
            "Cannot deserialize {} {!r} using {}".format(
                type(dct), dct, dict_to_dataclass))

    try:
        fld_types = dataclass_field_types(cls, require_bound=True)
    except TypeError:
        raise DeserializationError(
            "Cannot deserialize unbound generic {}".format(cls))

    try:
        return cls(
            **{
                fld.name: deserialization_func(fld_type, dct[fld.name])
                for fld, fld_type in fld_types if fld.name in dct
            })
    except TypeError:
        raise DeserializationError(
            "Missing one or more required fields to deserialize {!r} as {}".
            format(dct, cls))