import functools
import types
def check_types(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
for i, name in enumerate(f.__code__.co_varnames):
tp = f.__annotations__.get(name)
if tp is not None:
val = kwargs[name] if name in kwargs else args[i]
# assert(isinstance(val, tp))
print(name, isinstance(val, tp))
ans = f(*args, **kwargs)
tp = f.__annotations__.get('return')
if tp is not None:
# assert(isinstance(ans, tp))
print('return', isinstance(val, tp))
return ans
return wrapper
@check_types
def f(a: int, b: types.FunctionType) -> str:
pass
def main():
def g(): pass
f(1.0, g)
if __name__ == '__main__':
main()
aW1wb3J0IGZ1bmN0b29scwppbXBvcnQgdHlwZXMKCgpkZWYgY2hlY2tfdHlwZXMoZik6CglAZnVuY3Rvb2xzLndyYXBzKGYpCglkZWYgd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgoJCWZvciBpLCBuYW1lIGluIGVudW1lcmF0ZShmLl9fY29kZV9fLmNvX3Zhcm5hbWVzKToKCQkJdHAgPSBmLl9fYW5ub3RhdGlvbnNfXy5nZXQobmFtZSkKCQkJaWYgdHAgaXMgbm90IE5vbmU6CgkJCQl2YWwgPSBrd2FyZ3NbbmFtZV0gaWYgbmFtZSBpbiBrd2FyZ3MgZWxzZSBhcmdzW2ldCgkJCQkjIGFzc2VydChpc2luc3RhbmNlKHZhbCwgdHApKQoJCQkJcHJpbnQobmFtZSwgaXNpbnN0YW5jZSh2YWwsIHRwKSkKCQlhbnMgPSBmKCphcmdzLCAqKmt3YXJncykKCQl0cCA9IGYuX19hbm5vdGF0aW9uc19fLmdldCgncmV0dXJuJykKCQlpZiB0cCBpcyBub3QgTm9uZToKCQkJIyBhc3NlcnQoaXNpbnN0YW5jZShhbnMsIHRwKSkKCQkJcHJpbnQoJ3JldHVybicsIGlzaW5zdGFuY2UodmFsLCB0cCkpCgkJcmV0dXJuIGFucwoJcmV0dXJuIHdyYXBwZXIKCgpAY2hlY2tfdHlwZXMKZGVmIGYoYTogaW50LCBiOiB0eXBlcy5GdW5jdGlvblR5cGUpIC0+IHN0cjoKCXBhc3MKCgpkZWYgbWFpbigpOgoJZGVmIGcoKTogcGFzcwoJZigxLjAsIGcpCgkKCQppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgoJbWFpbigp