def _is_concretely(types: IsInstanceArgT, cls: Type) -> bool: try: # Check for List[int], Mapping[int, int], etc. _, cls = guess_polymorphic_type(cls) except TypeError: pass try: return issubclass(cls, types) except TypeError: return False
def _polymorphic_type(typ: Type) -> Tuple[Type, Type]: try: polymorphic_type, cls = __polymorphic_type_cache[typ] except KeyError: try: val = guess_polymorphic_type(typ) except TypeError: val = (TypeError, None) __polymorphic_type_cache[typ] = val return val if polymorphic_type is TypeError: raise TypeError() return polymorphic_type, cls
def _is_model(cls: Type) -> Tuple[bool, Type, Optional[Type]]: # Returns (is_model, polymorphic_type). # polymorphic type (if available) will be list if it's a list, # dict if dict, etc, then that means it's a List[ModelType], # Dict[ModelType] etc, so # we have to deserialize them as such. polymorphic_type = None try: polymorphic_type, cls = guess_polymorphic_type(cls) except TypeError: pass try: return issubclass(remove_optional(cls), ModelT), cls, polymorphic_type except TypeError: # typing.Any cannot be used with subclass return False, cls, None
def test_guess_polymorphic_type__not_generic(): class X: ... with pytest.raises(TypeError): guess_polymorphic_type(str) with pytest.raises(TypeError): guess_polymorphic_type(bytes) with pytest.raises(TypeError): guess_polymorphic_type(X)
def test_guess_polymorphic_type(input, expected): assert guess_polymorphic_type(input) == expected assert guess_polymorphic_type(Optional[input]) == expected assert guess_polymorphic_type(Union[input, None]) == expected