This package intends to provide run-time type checking for functions annotated
with argument type hints (standard library typing
module in Python 3.5, or
backports.typing
package in Python 3.3 / 3.4).
Example:
from typing import Sequence, List
from typo import type_check
@type_check
def f(x: int, s: Sequence[int]) -> List[int]:
...
The @type_check
decorator ensures that the values passed to annotated
arguments will have their types checked before the function is executed;
return value can be optionally checked as well.
If the value types are not consistent with the function signature, a
TypeError
with a descriptive error message will be raised. For
instance, calling function f
from the example above with wrong
argument types,
>>> f(1, (0, 2.2))
results in an exception being thrown:
TypeError: invalid item #1 of `s`: expected int, got float
Note: this is work-in-progress and not all typing
primitives are
supported; however all supported constructs should be covered by a
good number of tests.
Here's some of the supported type hints: simple types, List
, Dict
,
Tuple
, Sequence
, Set
, TypeVar
(with support for constraints
and upper bounds).
What's not supported: Iterator
and Generator
(which we can't
inspect due to their laziness), Callable
(which we can't check
without calling it), forward references (which is possible to
support but requires more work), covariant and contravariant
type variables (this requires more thought but isn't likely
to be helpful in the runtime context).