import typing
T = typing.TypeVar('T')
[docs]
def validate_instance(obj: T,
clz: type,
param_name: typing.Optional[str] = None) -> T:
"""
Validate that `obj` is instance of `clz` or raise :class:`ValueError` otherwise.
:param obj: and instance for validation.
:param clz: the target class.
:param param_name: name of the object to include in the error message.
:return: the `obj` if the validation passes.
:raise ValueError: if the instance check fails.
"""
if not isinstance(obj, clz):
if param_name is None:
raise ValueError(f'The object must be an instance of {clz} but was {type(obj)}')
else:
raise ValueError(f'{param_name} must be an instance of {clz} but was {type(obj)}')
return obj
[docs]
def validate_optional_instance(obj: typing.Optional[T],
clz: type,
param_name: typing.Optional[str] = None) -> typing.Optional[T]:
"""
Validate that `obj` is instance of `clz` or `None`, or raise :class:`ValueError` otherwise.
:param obj: and instance for validation or `None`.
:param clz: the target class.
:param param_name: name of the object to include in the error message.
:return: the `obj` if the validation passes.
:raise ValueError: if `obj` is *not* `None` and the instance check fails.
"""
if obj is not None:
return validate_instance(obj, clz, param_name)