decorator.py 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. # Базовый синтаксис декоратора в python
  2. def my_decorator(func):
  3. def wrapper_func():
  4. # Делаем что-то до вызова функции
  5. func()
  6. # Делаем что-то после вызова функции
  7. return wrapper_func
  8. '''
  9. def decorator(func):
  10. def wrapper():
  11. print('Start decorator')
  12. func()
  13. print('Finish decorator')
  14. return wrapper
  15. '''
  16. def decorator(func):
  17. def inner(*args, **kwargs):
  18. print('Стартуем декоратор')
  19. func(*args, **kwargs)
  20. print('Заканчиваем декоратор')
  21. return inner
  22. def decorator_2(func):
  23. def inner(*args, **kwargs):
  24. print('Стартуем декоратор')
  25. func_res = func(*args, **kwargs)
  26. print(f'Функция func вернула значение "{func_res}"')
  27. print('Заканчиваем декоратор')
  28. return func_res.swapcase()
  29. return inner
  30. @decorator_2
  31. def say_hello_to(name, surname):
  32. return f'Hello {name} {surname}'
  33. decorator
  34. def my_func():
  35. print('This is my mega function!')
  36. def header_h1(func):
  37. def inner(*args, **kwargs):
  38. result = func(*args, **kwargs)
  39. return f'<h1>{result}</h1>'
  40. return inner
  41. @header_h1
  42. def one_more_func(name, surname):
  43. return f'Hello {name} {surname}'
  44. def repeater(func):
  45. def wrapper(*args, **kwargs):
  46. func(*args, **kwargs)
  47. func(*args, **kwargs)
  48. func(*args, **kwargs)
  49. return wrapper
  50. def text_decor(func):
  51. def inner(*args, **kwargs):
  52. print('Hello')
  53. return func(*args, **kwargs)
  54. print('Goodbye!')
  55. return inner
  56. @text_decor
  57. def multiply(num1, num2):
  58. print(num1 * num2)
  59. def double_it(func):
  60. '''Декоратор возвращает удвоенный результат вызова декорируемой функции'''
  61. def inner(*args, **kwargs):
  62. res = func(*args, **kwargs)
  63. return res * 2
  64. return inner
  65. @double_it
  66. def get_sum_kwargs_values(**kwargs):
  67. return sum(kwargs.values())
  68. def uppercase_elements(func):
  69. def inner(*args, **kwargs):
  70. res = func(*args, **kwargs)
  71. if isinstance(res, dict):
  72. my_dict = {}
  73. for key, value in res.items():
  74. if isinstance(key, str):
  75. my_dict[key.upper()] = value
  76. else:
  77. my_dict[key] = value
  78. return my_dict
  79. else:
  80. my_list = []
  81. for x in res:
  82. if isinstance(x, str):
  83. my_list.append(x.upper())
  84. else:
  85. my_list.append(x)
  86. return my_list
  87. # return {key:value for key, value in res.items()}
  88. return inner
  89. @uppercase_elements
  90. def foo_1(**kwargs):
  91. return {1: 'one', 2: 'store', 'three': 3, 'four': 4} | kwargs
  92. @uppercase_elements
  93. def my_func():
  94. return ['monarch', 'Touch', 'officiaL', 'DangerouS', 'breathe']
  95. def first_validator(func):
  96. def my_wrapper(*args, **kwargs):
  97. print(f"Начинаем важную проверку")
  98. if len(args) == 3:
  99. func(*args, **kwargs)
  100. else:
  101. print(f"Важная проверка не пройдена")
  102. return None
  103. print(f"Заканчиваем важную проверку")
  104. return my_wrapper
  105. def second_validator(func):
  106. def my_wrapper(*args, **kwargs):
  107. print(f"Начинаем самую важную проверку")
  108. if kwargs.get('name') == 'Boris':
  109. func(*args)
  110. else:
  111. print(f"Самая важная проверка пройдена")
  112. return None
  113. print(f"Заканчиваем самую важную проверку")
  114. return my_wrapper
  115. @second_validator
  116. @first_validator
  117. def sum_values(*args):
  118. print(f'Получили результат равный {sum(args)}')
  119. def validate_all_args_str(func):
  120. def wrapper(*args, **kwargs):
  121. if len([True for x in args if type(x) == str]) == len(args):
  122. return func(*args, **kwargs)
  123. else:
  124. print('Все аргументы должны быть строками')
  125. return wrapper
  126. def validate_all_kwargs_int_pos(func):
  127. def wrapper(*args, **kwargs):
  128. if len([True for val in kwargs.values() if isinstance(val, int) and val > 0]) == len(kwargs):
  129. return func(*args, **kwargs)
  130. else:
  131. print("Все именованные аргументы должны быть положительными числами")
  132. return wrapper
  133. def filter_even(func):
  134. def wrapper(*args, **kwargs):
  135. my_list = []
  136. for val in args:
  137. if isinstance(val, int):
  138. if val%2 == 0:
  139. my_list.append(val)
  140. if (isinstance(val, (str, list, tuple, dict))):
  141. if len(val)%2 == 0:
  142. my_list.append(val)
  143. return func(*my_list, **kwargs)
  144. return wrapper
  145. def delete_short(func):
  146. def wrapper(*args, **kwargs):
  147. my_dict = {}
  148. for key, value in kwargs.items():
  149. if len(key) > 4:
  150. my_dict[key] = value
  151. return func(*args, **my_dict)
  152. return wrapper
  153. @filter_even
  154. @delete_short
  155. def concatenate(*args, **kwargs):
  156. result = ""
  157. for arg in args + tuple(kwargs.values()):
  158. result += str(arg)
  159. return result
  160. def main():
  161. print(concatenate("Я", "хочу", "Выучить", "Питон", a="За", qwerty=10, c="Месяцев"))
  162. # res = say_hello_to('Vasya', 'Ivanov')
  163. # print(f'{res=}')
  164. # res = one_more_func("gennadi", "LOSKOV")
  165. # print(f'{res=}')
  166. # print(multiply(3, 5))
  167. # print(get_sum_kwargs_values(a=4, b=5, d=3, t=6, r=8))
  168. # print(foo_1(**{'Five': 5, 'sIx': 6}))
  169. # print(my_func())
  170. # sum_values(70, 1, 6, name='Boris')
  171. # print(concatenate("Ну", "Когда", "Уже", "Я", "Выучу", "Питон?"))
  172. # print(concatenate(a="Я", b="Выучу", c="Этот", d="Питон", e="!"))
  173. # print(concatenate(a=10, b=20, c=50))
  174. if __name__ == '__main__':
  175. main()