fork download
  1. import functools
  2. import types
  3.  
  4.  
  5. def check_types(f):
  6. @functools.wraps(f)
  7. def wrapper(*args, **kwargs):
  8. for i, name in enumerate(f.__code__.co_varnames):
  9. tp = f.__annotations__.get(name)
  10. if tp is not None:
  11. val = kwargs[name] if name in kwargs else args[i]
  12. # assert(isinstance(val, tp))
  13. print(name, isinstance(val, tp))
  14. ans = f(*args, **kwargs)
  15. tp = f.__annotations__.get('return')
  16. if tp is not None:
  17. # assert(isinstance(ans, tp))
  18. print('return', isinstance(val, tp))
  19. return ans
  20. return wrapper
  21.  
  22.  
  23. @check_types
  24. def f(a: int, b: types.FunctionType) -> str:
  25. pass
  26.  
  27.  
  28. def main():
  29. def g(): pass
  30. f(1.0, g)
  31.  
  32.  
  33. if __name__ == '__main__':
  34. main()
Success #stdin #stdout 0.03s 9072KB
stdin
Standard input is empty
stdout
a False
b True
return False