from python_static_type import decorate_static_type, ExceptionStaticType


class Test:
    pass


@decorate_static_type
def func1(x: int, y: str) -> list:
    return (x, y) # Указали неправильный тип.


@decorate_static_type
def func2(*, key: str = '', tuple_var: tuple = (), list_var: list = [[[[]]]]) -> str:
    return key


func2() # Отработает хорошо.

try:
    func1(1, "str")
except ExceptionStaticType as e:
    print(e)  # Функция func1: Возвращает неожиданное значение, ожидалось "list"
try:
    func1(y=1, x="2")
except ExceptionStaticType as e:
    print(e)  # Функция func1: Аргумент "y" имеет тип "int", а ожидался "str"
try:
    func1('2', 1)
except ExceptionStaticType as e:
    print(e)  # Функция func1: Аргумент "x" имеет тип "str", а ожидался "int"
try:
    func1(1, Test)
except ExceptionStaticType as e:
    print(e)  # Функция func1: Аргумент "y" имеет тип "type", а ожидался "str".
try:
    func1(1, True)
except ExceptionStaticType as e:
    print(e)  # Функция func1: Аргумент "y" имеет тип "bool", а ожидался "str".
