From f6d14ece8d495aa9c36357fd59c22d0162d92887 Mon Sep 17 00:00:00 2001 From: Anderson Brandao Date: Wed, 5 Nov 2025 23:01:27 -0300 Subject: [PATCH] Decorators --- src/decorators.py | 46 +++++++++++++++++++++++++++ tests/test_decorators.py | 68 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 src/decorators.py create mode 100644 tests/test_decorators.py diff --git a/src/decorators.py b/src/decorators.py new file mode 100644 index 0000000..51b55f2 --- /dev/null +++ b/src/decorators.py @@ -0,0 +1,46 @@ +from functools import update_wrapper, wraps + + +def basic_decorator(func): + def wrapper(): + return func() + + return wrapper + + +def cool_decorator(func): + @wraps(func) + def wrapper(): + return func() + + return wrapper + + +def cooler_decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + + return wrapper + + +def offset(offset_): + def decorator(func): + @wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + offset_ + + return wrapper + + return decorator + + +class PrintNameUpper: + def __init__(self, func): + update_wrapper(self, func) + self.func = func + self.name_upper = str(func.__name__).upper() + + def __call__(self, *args, **kwargs): + print(self.name_upper) + return self.func(*args, **kwargs) diff --git a/tests/test_decorators.py b/tests/test_decorators.py new file mode 100644 index 0000000..85afe16 --- /dev/null +++ b/tests/test_decorators.py @@ -0,0 +1,68 @@ +from decorators import ( + PrintNameUpper, + basic_decorator, + cool_decorator, + cooler_decorator, + offset, +) + + +def test_basic_decorator_changes_name_and_doc(): + def bla(): + """blabla""" + pass + + assert "bla" == bla.__name__ + assert "blabla" == bla.__doc__ + + bla = basic_decorator(bla) + + assert "bla" != bla.__name__ + assert "blabla" != bla.__doc__ + + +def test_cool_decorator_keeps_name_and_doc(): + def bla(): + """blabla""" + pass + + assert "bla" == bla.__name__ + assert "blabla" == bla.__doc__ + + bla = cool_decorator(bla) + + assert "bla" == bla.__name__ + assert "blabla" == bla.__doc__ + + +def test_cooler_decorator_decorates_functions_with_args_and_kwargs(): + @cooler_decorator + def bla(a): + pass + + @cooler_decorator + def ble(a, b): + pass + + bla(1) + ble(1, b=2) + + +def test_decorator_with_args(): + @offset(42) + def bla(a): + return a + + value = 5 + assert (value + 42) == bla(value) + + +def test_class_decorator(capsys): + @PrintNameUpper + def bla(): + pass + + bla() + out = capsys.readouterr().out + assert "BLA" in out + assert "bla" not in out