#!/usr/bin/env python3 # vim: set noexpandtab: from functools import wraps from inspect import signature def type_checked(func): @wraps(func) def wrapper(*args, **kwargs): sig = signature(func) bound = sig.bind(*args, **kwargs) for k,v in bound.arguments.items(): ann = sig.parameters[k].annotation if ann and not isinstance(v, ann): raise ValueError("Argument {} should be of type {}, is {}" .format(k, ann, type(v))) return func(*bound.args, **bound.kwargs) return wrapper