# Базовый синтаксис декоратора в python def my_decorator(func): def wrapper_func(): # Делаем что-то до вызова функции func() # Делаем что-то после вызова функции return wrapper_func ''' def decorator(func): def wrapper(): print('Start decorator') func() print('Finish decorator') return wrapper ''' def decorator(func): def inner(*args, **kwargs): print('Стартуем декоратор') func(*args, **kwargs) print('Заканчиваем декоратор') return inner def decorator_2(func): def inner(*args, **kwargs): print('Стартуем декоратор') func_res = func(*args, **kwargs) print(f'Функция func вернула значение "{func_res}"') print('Заканчиваем декоратор') return func_res.swapcase() return inner @decorator_2 def say_hello_to(name, surname): return f'Hello {name} {surname}' decorator def my_func(): print('This is my mega function!') def header_h1(func): def inner(*args, **kwargs): result = func(*args, **kwargs) return f'

{result}

' return inner @header_h1 def one_more_func(name, surname): return f'Hello {name} {surname}' def repeater(func): def wrapper(*args, **kwargs): func(*args, **kwargs) func(*args, **kwargs) func(*args, **kwargs) return wrapper def text_decor(func): def inner(*args, **kwargs): print('Hello') return func(*args, **kwargs) print('Goodbye!') return inner @text_decor def multiply(num1, num2): print(num1 * num2) def double_it(func): '''Декоратор возвращает удвоенный результат вызова декорируемой функции''' def inner(*args, **kwargs): res = func(*args, **kwargs) return res * 2 return inner @double_it def get_sum_kwargs_values(**kwargs): return sum(kwargs.values()) def uppercase_elements(func): def inner(*args, **kwargs): res = func(*args, **kwargs) if isinstance(res, dict): my_dict = {} for key, value in res.items(): if isinstance(key, str): my_dict[key.upper()] = value else: my_dict[key] = value return my_dict else: my_list = [] for x in res: if isinstance(x, str): my_list.append(x.upper()) else: my_list.append(x) return my_list # return {key:value for key, value in res.items()} return inner @uppercase_elements def foo_1(**kwargs): return {1: 'one', 2: 'store', 'three': 3, 'four': 4} | kwargs @uppercase_elements def my_func(): return ['monarch', 'Touch', 'officiaL', 'DangerouS', 'breathe'] def first_validator(func): def my_wrapper(*args, **kwargs): print(f"Начинаем важную проверку") if len(args) == 3: func(*args, **kwargs) else: print(f"Важная проверка не пройдена") return None print(f"Заканчиваем важную проверку") return my_wrapper def second_validator(func): def my_wrapper(*args, **kwargs): print(f"Начинаем самую важную проверку") if kwargs.get('name') == 'Boris': func(*args) else: print(f"Самая важная проверка пройдена") return None print(f"Заканчиваем самую важную проверку") return my_wrapper @second_validator @first_validator def sum_values(*args): print(f'Получили результат равный {sum(args)}') def validate_all_args_str(func): def wrapper(*args, **kwargs): if len([True for x in args if type(x) == str]) == len(args): return func(*args, **kwargs) else: print('Все аргументы должны быть строками') return wrapper def validate_all_kwargs_int_pos(func): def wrapper(*args, **kwargs): if len([True for val in kwargs.values() if isinstance(val, int) and val > 0]) == len(kwargs): return func(*args, **kwargs) else: print("Все именованные аргументы должны быть положительными числами") return wrapper def filter_even(func): def wrapper(*args, **kwargs): my_list = [] for val in args: if isinstance(val, int): if val%2 == 0: my_list.append(val) if (isinstance(val, (str, list, tuple, dict))): if len(val)%2 == 0: my_list.append(val) return func(*my_list, **kwargs) return wrapper def delete_short(func): def wrapper(*args, **kwargs): my_dict = {} for key, value in kwargs.items(): if len(key) > 4: my_dict[key] = value return func(*args, **my_dict) return wrapper @filter_even @delete_short def concatenate(*args, **kwargs): result = "" for arg in args + tuple(kwargs.values()): result += str(arg) return result def main(): print(concatenate("Я", "хочу", "Выучить", "Питон", a="За", qwerty=10, c="Месяцев")) # res = say_hello_to('Vasya', 'Ivanov') # print(f'{res=}') # res = one_more_func("gennadi", "LOSKOV") # print(f'{res=}') # print(multiply(3, 5)) # print(get_sum_kwargs_values(a=4, b=5, d=3, t=6, r=8)) # print(foo_1(**{'Five': 5, 'sIx': 6})) # print(my_func()) # sum_values(70, 1, 6, name='Boris') # print(concatenate("Ну", "Когда", "Уже", "Я", "Выучу", "Питон?")) # print(concatenate(a="Я", b="Выучу", c="Этот", d="Питон", e="!")) # print(concatenate(a=10, b=20, c=50)) if __name__ == '__main__': main()