TelenkovDmitry hace 3 meses
padre
commit
5fb35c3a60

+ 94 - 0
courses/python_func/decorator_1.py

@@ -0,0 +1,94 @@
+from functools import wraps
+
+
+'''
+Этот декоратор демонстрирует способ сохранить данные
+об исходной функции
+
+def table(func):
+    def inner(*args, **kwargs):
+        print('<table>')
+        func(*args, **kwargs)
+        print('</table>')
+
+    inner.__name__ = func.__name__
+    inner.__doc__ = func.__name__
+    inner.__annotations__ = func.__annotations__
+    return inner
+'''
+    
+"""
+Это другой способ сохранить данные об исходной функции
+"""
+
+def table(func):
+    @wraps(func)
+    def inner(*args, **kwargs):
+        print('<table>')
+        func(*args, **kwargs)
+        print('</table>')
+    return inner
+
+
+@table
+def print_sqr_number(x: int) -> None:
+    """
+    Печатает квадрат числа x
+    :param x
+    :retrun: None
+    """
+    print(x ** 2)
+
+
+'''
+@table
+def say_hello(name: str, surname: str) -> None:
+    """Функция приветствует человека"""
+    print("Hello", name, surname)
+'''
+
+
+@table
+def say_bye(name):
+    print('Hello', name)
+
+
+def dec(fn):
+    print("Запуск декоратора")
+    def wrapper(*args, **kwargs):
+        print("Запуск inner")
+        return fn(*args, **kwargs)
+    return wrapper
+
+
+@dec
+def say_hello() -> None:
+    return 'Hello'
+    
+
+
+
+def main():
+
+    '''    
+    print(f'{say_hello.__name__         =  }')
+    print(f'{say_hello.__doc__          =  }')
+    print(f'{say_hello.__annotations__  =  }')
+            
+    print(f'{say_hello.__name__         =  }')
+    print(f'{say_bye.__name__          =  }')
+    '''
+
+    '''
+    print(f'{print_sqr_number.__name__        =  }')
+    print(f'{print_sqr_number.__doc__         =  }')
+    print(f'{print_sqr_number.__annotations__ =  }')
+
+    print_sqr_number(6)
+    '''
+    print(say_hello())
+    print(say_hello())
+    
+
+if __name__ == '__main__':
+    main()

+ 52 - 0
courses/python_func/decorator_2.py

@@ -0,0 +1,52 @@
+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()

+ 113 - 6
courses/python_func/decorator_4.py

@@ -113,11 +113,6 @@ def limit_query(n):
     return decorator
 
 
-@limit_query(3)
-def add(a: int, b: int):
-    return a + b
-
-
 def monkey_patching(arg='Monkey', kwarg='patching'):
     def decorator(func):
         @wraps(func)
@@ -155,10 +150,122 @@ def concatenate(**kwargs):
     return result
 
 
+def pass_arguments(*args_, **kwargs_):
+    def decorator(func):
+        @wraps(func)
+        def wrapper(*args, **kwargs):
+            new_args = args + args_
+            new_kwargs = kwargs | kwargs_
+            return func(*new_args, **new_kwargs)
+        return wrapper
+    return decorator
+
+
+def convert_to(type_):
+    def decorator(func):
+        @wraps(func)
+        def wrapper(*args, **kwargs):
+            return type_(func(*args, **kwargs))
+        return wrapper
+    return decorator
+
+
+@convert_to(str)
+def add_values(a, b):
+    return a + b
+
+
+'''
+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_args(type_):
+    def decorator(func):
+        @wraps(func)
+        def wrapper(*args, **kwargs):
+            if len([True for x in args if type(x) == type_]) == len(args):
+                return func(*args, **kwargs)
+            else:
+                print(f'Все аргументы должны принадлежать типу {type_}')
+        return wrapper
+    return decorator
+
+
+@validate_all_args(set)
+def print_args_kwargs(*args, **kwargs):
+    for i, value in enumerate(args):
+        print(i, value)
+    for k, v in sorted(kwargs.items()):
+        print(f'{k} = {v}')
+
+
+def compose(*args_):
+    def decorator(func):
+        @wraps(func)
+        def wrapper(*args, **kwargs):
+            result = func(*args, **kwargs)
+            for f in args_:
+                result = f(result)
+            return result
+        return wrapper
+    return decorator
+
+
+def double_it(a):
+    return a * 2
+
+
+def increment(a):
+    return a + 1
+    
+@compose(double_it, increment)
+def get_sum(*args):
+    return sum(args)
+
+
+def add_attrs(**kwargs_):
+    def decorator(func):
+        @wraps(func)
+        def wrapper(*args, **kwargs):
+            return func(*args, **kwargs)
+        for key, value in kwargs_.items():
+            setattr(wrapper, key, value)
+        return wrapper
+    return decorator
+
+
+@add_attrs(test=True, ordered=True)
+def add(a, b):
+    return a + b
+
 
 def main():
 
-    print(concatenate(a="Я", b="Выучу", c="Этот", d="Питон", e="!"))
+    print(add(10, 5))
+    print(add.test)
+    print(add.ordered)
+
+
+    # print(get_sum(5))
+    # print(get_sum(20, 10))
+    # print(get_sum(5, 15, 25))
+
+    # print_args_kwargs([], [1], [1, 2], b=set(), w=set())
+    # print_args_kwargs(1, 2, 3, 4, b=300, w=40, t=50, a=100)
+
+    # result = add_values(10, 20)
+    # print(f"Результат: {result}, тип результата {type(result)}")
+
+    # print(add(5, 4, 6, a=1, b=2))
+
+    # print(concatenate(a="Я", b="Выучу", c="Этот", d="Питон", e="!"))
 
     # print_args_kwargs(1, 2, 3, 4, b=300, w=40, t=50, a=100)