add type validation for state setattr
This commit is contained in:
parent
98394ceb8e
commit
39952ce70b
@ -510,16 +510,66 @@ def _issubclass(cls: GenericType, cls_check: GenericType, instance: Any = None)
|
|||||||
raise TypeError(f"Invalid type for issubclass: {cls_base}") from te
|
raise TypeError(f"Invalid type for issubclass: {cls_base}") from te
|
||||||
|
|
||||||
|
|
||||||
def _isinstance(obj: Any, cls: GenericType) -> bool:
|
def _isinstance(obj: Any, cls: GenericType, nested: bool = False) -> bool:
|
||||||
"""Check if an object is an instance of a class.
|
"""Check if an object is an instance of a class.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
obj: The object to check.
|
obj: The object to check.
|
||||||
cls: The class to check against.
|
cls: The class to check against.
|
||||||
|
nested: Whether the check is nested.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
Whether the object is an instance of the class.
|
Whether the object is an instance of the class.
|
||||||
"""
|
"""
|
||||||
|
if cls is Any:
|
||||||
|
return True
|
||||||
|
|
||||||
|
if cls is None or cls is type(None):
|
||||||
|
return obj is None
|
||||||
|
|
||||||
|
if is_literal(cls):
|
||||||
|
return obj in get_args(cls)
|
||||||
|
|
||||||
|
if is_union(cls):
|
||||||
|
return any(_isinstance(obj, arg) for arg in get_args(cls))
|
||||||
|
|
||||||
|
origin = get_origin(cls)
|
||||||
|
|
||||||
|
if origin is None:
|
||||||
|
# cls is a simple class
|
||||||
|
return isinstance(obj, cls)
|
||||||
|
|
||||||
|
args = get_args(cls)
|
||||||
|
|
||||||
|
if not args:
|
||||||
|
# cls is a simple generic class
|
||||||
|
return isinstance(obj, origin)
|
||||||
|
|
||||||
|
if nested and args:
|
||||||
|
if origin is list:
|
||||||
|
return isinstance(obj, list) and all(
|
||||||
|
_isinstance(item, args[0]) for item in obj
|
||||||
|
)
|
||||||
|
if origin is tuple:
|
||||||
|
if args[-1] is Ellipsis:
|
||||||
|
return isinstance(obj, tuple) and all(
|
||||||
|
_isinstance(item, args[0]) for item in obj
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
isinstance(obj, tuple)
|
||||||
|
and len(obj) == len(args)
|
||||||
|
and all(_isinstance(item, arg) for item, arg in zip(obj, args))
|
||||||
|
)
|
||||||
|
if origin is dict:
|
||||||
|
return isinstance(obj, dict) and all(
|
||||||
|
_isinstance(key, args[0]) and _isinstance(value, args[1])
|
||||||
|
for key, value in obj.items()
|
||||||
|
)
|
||||||
|
if origin is set:
|
||||||
|
return isinstance(obj, set) and all(
|
||||||
|
_isinstance(item, args[0]) for item in obj
|
||||||
|
)
|
||||||
|
|
||||||
return isinstance(obj, get_base_class(cls))
|
return isinstance(obj, get_base_class(cls))
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user