#!/usr/bin/env python3
from functools import wraps
from typing import get_type_hints
from collections import defaultdict
_funcs_table = defaultdict(dict)
def overload(func):
arg_type = tuple(get_type_hints(func).values())[0]
_funcs_table[func.__name__][arg_type] = func
@wraps(func)
def wrapper(arg):
return _funcs_table[func.__name__][type(arg)](arg)
return wrapper
@overload
def f(x: int):
print(f'f(int): {x}')
@overload
def f(x: str):
print(f'f(str): {x}!')
@overload
def f2(y: int):
print(f'f2(int): {y}')
@overload
def f2(y: float):
print(f'f2(float): {y}')
def main():
f(42)
f('Hello')
f2(43)
f2(43.0003)
if __name__ == '__main__':
main()
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKZnJvbSB0eXBpbmcgaW1wb3J0IGdldF90eXBlX2hpbnRzCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CgoKX2Z1bmNzX3RhYmxlID0gZGVmYXVsdGRpY3QoZGljdCkKCgpkZWYgb3ZlcmxvYWQoZnVuYyk6CiAgICBhcmdfdHlwZSA9IHR1cGxlKGdldF90eXBlX2hpbnRzKGZ1bmMpLnZhbHVlcygpKVswXQogICAgX2Z1bmNzX3RhYmxlW2Z1bmMuX19uYW1lX19dW2FyZ190eXBlXSA9IGZ1bmMKICAgIEB3cmFwcyhmdW5jKQogICAgZGVmIHdyYXBwZXIoYXJnKToKICAgICAgICByZXR1cm4gX2Z1bmNzX3RhYmxlW2Z1bmMuX19uYW1lX19dW3R5cGUoYXJnKV0oYXJnKQogICAgcmV0dXJuIHdyYXBwZXIKCiAgICAKQG92ZXJsb2FkCmRlZiBmKHg6IGludCk6CiAgICBwcmludChmJ2YoaW50KToge3h9JykKCgpAb3ZlcmxvYWQKZGVmIGYoeDogc3RyKToKICAgIHByaW50KGYnZihzdHIpOiB7eH0hJykKICAgIAoKQG92ZXJsb2FkCmRlZiBmMih5OiBpbnQpOgogICAgcHJpbnQoZidmMihpbnQpOiB7eX0nKQoKCkBvdmVybG9hZApkZWYgZjIoeTogZmxvYXQpOgogICAgcHJpbnQoZidmMihmbG9hdCk6IHt5fScpCgoKZGVmIG1haW4oKToKICAgIGYoNDIpCiAgICBmKCdIZWxsbycpCiAgICBmMig0MykKICAgIGYyKDQzLjAwMDMpCiAgICAKIAppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigp