dtelenkov преди 3 месеца
родител
ревизия
0b923d41de
променени са 1 файла, в които са добавени 152 реда и са изтрити 12 реда
  1. 152 12
      courses/python_func/decorator_3.py

+ 152 - 12
courses/python_func/decorator_3.py

@@ -6,11 +6,7 @@ def no_side_effects_decorator(func):
     @wraps(func)
     def inner(*args, **kwargs):
         if isinstance(args[0], (list, dict, set)):
-            # copeed_args = tuple([args[0].copy(), args[1]])\
-            copeed_args = tuple([deepcopy(args[0]), args[1]])
-            print(copeed_args)
-        # elif isinstance(args[0], dict):
-
+            copeed_args = tuple([args[0].copy(), *args[1:]])
         else:
             copeed_args = args
         return func(*copeed_args, **kwargs)
@@ -18,22 +14,166 @@ def no_side_effects_decorator(func):
 
 
 @no_side_effects_decorator
+def add_element(data, element):
+    data.append(element)
+    return data
+'''
 def add_element(data, key, value=None):
     data[key] = value
     return data
+'''
 
-def test(*args, **kwargs):
-    print(args)
-    print(args[0])
+
+def add_args(func):
+    @wraps(func)
+    def inner(*args, **kwargs):
+        modifed_args = ('begin', ) + args + ('end', )
+        return func(*modifed_args, **kwargs)
+    return inner
+
+@add_args
+def concatenate(*args):
+    """
+    Возвращает конкатенацию переданных строк
+    """
+    return ', '.join(args)
+
+
+def explicit_args(func):
+    @wraps(func)
+    def inner(*args, **kwargs):
+        if len(args):
+            print('Вы не можете передать позиционные аргументы. Используйте именованный способ передачи значений')
+            return
+        else:
+            return func(*args, **kwargs)
+    return inner
+
+
+@explicit_args
+def add(a: int, b: int) -> int:
+    '''Возвращает сумму двух чисел'''
+    return a + b
 
 
+def reverse(func):
+    @wraps(func)
+    def inner(*args, **kwargs):
+        reversed_args = args[::-1]
+        return func(*reversed_args)
+    return inner
+
+
+def monkey_patching(func):
+    @wraps(func)
+    def inner(*args, **kwargs):
+        patched_args = ('Monkey', )*len(args)
+        patched_kwargs = {key:'patching' for key, _ in kwargs.items()}
+        return func(*patched_args, **patched_kwargs)
+    return inner
+
+
+@monkey_patching
+def info_kwargs(**kwargs):
+    """Выводит информацию о переданных kwargs"""
+    for k, v in sorted(kwargs.items()):
+        print(f'{k} = {v}')
+
+
+def counting_calls(func):
+    @wraps(func)
+    def inner(*args, **kwargs):
+        inner.call_count += 1
+        inner.calls.append({'args': args, 'kwargs':kwargs})
+        return func(*args, **kwargs)        
+    setattr(inner, 'call_count', 0)
+    setattr(inner, 'calls', [])
+    return inner
+
+
+@counting_calls
+def add(a: int, b: int) -> int:
+    '''Возвращает сумму двух чисел'''
+    return a + b
+
+
+def check_count_args(func):
+    @wraps(func)
+    def inner(*args, **kwargs):
+        if (len(args) + len(kwargs)) == 2:
+            return func(*args, **kwargs)
+        elif (len(args) + len(kwargs)) < 2:
+            print("Not enough arguments")
+        else:
+            print("Too many arguments")
+    return inner
+
+
+def cache_result(func):
+    cache = {}
+    @wraps(func)
+    def inner(*args, **kwargs):
+        nonlocal cache
+        key = (args, tuple(kwargs.items()))
+        if key in cache.keys():
+            print(f'[FROM CACHE] Вызов {inner.__name__} = {cache[key]}')
+            return cache[key]
+        else:
+            res = func(*args, **kwargs)
+            cache[key] = res
+            return res
+    return inner
+
+
+@cache_result
+def multiply(a, b):
+    return a * b
+
+
+def test(*args, **kwargs):
+    pass
+
 def main():
-    my_list = [1, 2, 3]
+
+    print(add(10, b=20))
+    print(add(7, 5))
+    print(add(12, 45))
+    print('Количество вызовов =', add.call_count)
+    print(add.calls[2])
+
+    print(add(b=11, a=22))
+    print(add.calls[3])
+
+    # print(multiply(4, 5))  # Вызываем 1й раз функцию с аргументами 4 и 5. Идет сохранение результата
+
+    # print(multiply(4, 5))  # При повторном вызове достаем из кеша
+
+    # print(multiply(5, 8))  # Впервые вызывает с аргументами 5 и 8
+    # print(multiply(5, 8))  # Достаем из кеша результат вызова multiply(5, 8)
+    # print(multiply(5, 8))  # Вновь достаем из кеша
+
+    # print(multiply(-3, 7))  # Впервые вычисляем результат вызова multiply(-3, 7), сохраняем в кеше
+    # print(multiply(-3, 7))  # Достаем из кеша multiply(-3, 7)
+    
+
+    # info_kwargs(first_name="John", last_name="Doe", age=33)
+    # info_kwargs(c=43, b= 32, a=32)
+    # print(info_kwargs.__name__)
+    # print(info_kwargs.__doc__.strip())
+
+    # print(add(10, 20))
+
+    # print(concatenate('hello', 'world', 'my', 'name is', 'Artem'))
+    # print(concatenate('my', 'name is', 'Artem'))
+    # print(concatenate.__name__)
+    # print(concatenate.__doc__.strip())
+
+    # my_list = [1, 2, 3]
     # print('Результат вызова =', add_element(my_list, 4))
     # print('Результат вызова =', add_element(my_list, 5))
-    my_dict = {1: 'Hello', 2: 'World'}
-    print('Результат вызова =', add_element(my_dict, 4, 'four'))
-    print(my_list)
+    # my_dict = {1: 'Hello', 2: 'World'}
+    # print('Результат вызова =', add_element(my_dict, 4, 'four'))
+    # print(my_list)
     # print(add_element.__name__)
     # test(my_list)