import functools
import inspect
def type_checking( f) :
sig = inspect .signature ( f)
@ functools.wraps ( f)
def wrapper( *args, **kwargs) :
bound = sig.bind ( *args, **kwargs)
for k, v in bound.arguments .items ( ) :
if not isinstance ( v, sig.parameters [ k] .annotation ) :
raise TypeError ( )
return_value = f( *args, **kwargs)
if not isinstance ( return_value, sig.return_annotation ) :
raise TypeError ( )
return return_value
return wrapper
@ type_checking
def double( x: int ) -> int :
return x * 2
print ( double( 'a' ) )
aW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaW5zcGVjdAoKCmRlZiB0eXBlX2NoZWNraW5nKGYpOgogICAgc2lnID0gaW5zcGVjdC5zaWduYXR1cmUoZikKICAgIEBmdW5jdG9vbHMud3JhcHMoZikKICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgYm91bmQgPSBzaWcuYmluZCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgZm9yIGssIHYgaW4gYm91bmQuYXJndW1lbnRzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHYsIHNpZy5wYXJhbWV0ZXJzW2tdLmFubm90YXRpb24pOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCkKICAgICAgICByZXR1cm5fdmFsdWUgPSBmKCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyZXR1cm5fdmFsdWUsIHNpZy5yZXR1cm5fYW5ub3RhdGlvbik6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigpCiAgICAgICAgcmV0dXJuIHJldHVybl92YWx1ZQogICAgcmV0dXJuIHdyYXBwZXIKCgpAdHlwZV9jaGVja2luZwpkZWYgZG91YmxlKHg6IGludCkgLT4gaW50OgogICAgcmV0dXJuIHggKiAyCgpwcmludChkb3VibGUoJ2EnKSkK