def _build_value(type_: Type, data: Any, config: Config) -> Any: if is_union(type_): return _build_value_for_union(union=type_, data=data, config=config) elif is_generic_collection(type_) and is_instance(data, extract_origin_collection(type_)): return _build_value_for_collection(collection=type_, data=data, config=config) elif is_dataclass(type_) and is_instance(data, Data): return from_dict(data_class=type_, data=data, config=config) return data
def _build_value_for_collection(collection: Type, data: Any, config: Config) -> Any: collection_cls = extract_origin_collection(collection) if is_instance(data, Mapping): return collection_cls( (key, _build_value(type_=extract_generic(collection)[1], data=value, config=config)) for key, value in data.items()) return collection_cls( _build_value( type_=extract_generic(collection)[0], data=item, config=config) for item in data)
def _build_value_for_collection(collection: Type, data: Any, config: Config) -> Any: generic = extract_generic(collection) if is_instance(data, Mapping): return data.__class__( (key, _build_value(type_=generic[1], data=value, config=config)) for key, value in data.items()) collection_type = extract_origin_collection(collection) if collection_type == tuple and not (len(generic) == 2 and generic[1] == Ellipsis): return data.__class__( _build_value(type_=item_type, data=item, config=config) for item, item_type in zip(data, generic)) return data.__class__( _build_value(type_=generic[0], data=item, config=config) for item in data)
def test_extract_generic_collection(): assert extract_origin_collection(List[int]) == list