|
@@ -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([deepcopy(args[0]), args[1]])
|
|
|
- print(copeed_args)
|
|
|
-
|
|
|
-
|
|
|
+ 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])
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
- my_dict = {1: 'Hello', 2: 'World'}
|
|
|
- print('Результат вызова =', add_element(my_dict, 4, 'four'))
|
|
|
- print(my_list)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
|