Python's missing runtime type checker
pip install type-strict
from type_strict import strict
@strict
def person_age(name: str, age: int) -> str
return f"{name} is {age}"
# If the values mismatch the types, a TypeError is thrown.
person_age(...)
If you ever find yourself asserting all your types are correct, for example...
def func(person: Person, employee: Employee):
if not isinstance(person, Person):
raise TypeError("Expected person to be of type Person")
if not isinstance(employee, Employee):
raise TypeError("Expected employee to be of type Employee")
...
this library can simplify the same functionality into the following:
@strict
def func(person: Person, employee: Employee):
...
- Python 3.9+ support.
- Works with the
typing
library and default/custom Python types. - Checks embedded types recursively. (Eg
Dict[str, List[int]]
.) - Checks return type if specified.
- Works with any combination of args, kwargs, and defaults.
- Informative error messages.
- In the event of a failure, type-strict swallows the error to avoid user impact.
- Performance: Type checking is done at runtime. So, there is a performance impact—especially if the value has many members, for example, a long list. For static type checking consider mypy.
- Ignores variable-length args (varargs).
Wrong value.
@strict
def my_func(arg1: List[int]):
...
# Raises:
# TypeError('Value (whoops!) in "my_func(arg1=typing.List[int])" is not of type int')
my_func([1, 2, "whoops!", 3])
Wrong data structure.
@strict
def my_func(arg1: Dict[str, int]):
...
# Raises:
# TypeError('Expected type typing.Dict[str, int] in "my_func(arg1=typing.Dict[str, int])" got list')
my_func([1, 2, 3])
Wrong return type.
@strict
def my_func() -> int:
return "one"
# Raises:
# TypeError('Return value (one) in "my_func() -> int" is not of type int')
my_func()