from functools import wraps


def upper(func):
    @wraps(func)
    def inner(*args, **kwargs):
        """
        Внутренняя функция декоратора
        """
        return func(*args, **kwargs).upper()
    return inner


@upper
def concatenate(*args):
    """
    Возвращает конкатенацию переданных строк
    """
    return ', '.join(args)


def limit_qyery(func):
    call_counter = 0
    @wraps(func)
    def inner(*args, **kwargs):
        nonlocal call_counter
        call_counter += 1      
        if call_counter == 4:
            print("Лимит вызовов закончен, все 3 попытки израсходованы")
            return
        return func(*args, **kwargs)
    return inner


@limit_qyery
def add(a: int, b: int):
    return a + b


def main():
    # print(concatenate.__name__)
    # print(concatenate.__doc__.strip())
    
    print(add(4, 5))
    print(add(5, 8))
    print(add(9, 43))
    print(add(10, 33))
    print(add.__name__)


if __name__ == "__main__":
    main()