Last active
May 10, 2020 16:51
-
-
Save Farrukhraz/a8bd8ddb544028c1719edaa60d25856b to your computer and use it in GitHub Desktop.
All given functions (decorators) should be in the separate module: decorators.py; Thnks for this article "https://proglib.io/p/vse-chto-nuzhno-znat-o-dekoratorah-python-2020-05-09#dark-theme-toggler"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import functools | |
def debug(func): | |
@functools.wraps(func) | |
def wrapper_debug(*args, **kwargs): | |
args_repr = [repr(a) for a in args] | |
kwargs_repr = [f"{k}={v!r}" for k, v in kwargs.items()] | |
signature = ", ".join(args_repr + kwargs_repr) | |
print(f"Вызываем {func.__name__}({signature})") | |
value = func(*args, **kwargs) | |
print(f"{func.__name__!r} возвращает {value!r}") | |
return value | |
return wrapper_debug | |
# Wrapping imported function | |
math.factorial = debug(math.factorial) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Reapeats decorated function 'n' times. | |
import functools | |
def repeat(n): | |
def decorator_repeat(func): | |
@functools.wraps(func) | |
def wrapper(*args, **kwargs): | |
for _ in range(num_times): | |
value = func(*args, **kwargs) | |
return value | |
return wrapper | |
return decorator_repeat | |
@repeat(num_times=4) | |
def great(name): | |
print(f"Привет {name}") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Base decorator schema for more complex ones | |
# @functools.wraps(func); Let us save all meta data of original function | |
import functools | |
def decorator(func): | |
@functools.wraps(func) | |
def wrapper_decorator(*args, **kwargs): | |
# Что-то делаем до | |
value = func(*args, **kwargs) | |
# Что-то делаем после | |
return value | |
return wrapper_decorator |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
def slow_down(func): | |
"""Ждёт 1 секундеу, прежде чем вызвать переданную функцию""" | |
@functools.wraps(func) | |
def wrapper_slow_down(*args, **kwargs): | |
time.sleep(1) | |
return func(*args, **kwargs) | |
return wrapper_slow_down |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 'timer' decorator. Count the spent time for executing 'func' | |
# use 'timeit' for more accurate time measurements | |
import functools | |
import time | |
def timer(func): | |
"""Выводит время выполнения декорируемой функции""" | |
@functools.wraps(func) | |
def wrapper_timer(*args, **kwargs): | |
start_time = time.perf_counter() | |
value = func(*args, **kwargs) | |
end_time = time.perf_counter() | |
run_time = end_time - start_time | |
print(f"Функция {func.__name__!r} выполнена за {run_time:.4f} с") | |
return value | |
return wrapper_timer | |
# Example | |
@timer | |
def waste_some_time(num_times): | |
for _ in range(num_times): | |
sum([i**2 for i in range(10000)]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import random | |
PLUGINS = dict() | |
def register(func): | |
"""Регистрирует функцию как плагин""" | |
PLUGINS[func.__name__] = func | |
return func | |
@register | |
def say_hello(name): | |
return f"Привет, {name}!" | |
@register | |
def be_awesome(name): | |
return f"Привет, {name}, классно быть вместе!" | |
def randomly_greet(name): | |
greeter, greeter_func = random.choice(list(PLUGINS.items())) | |
print(f"Используется {greeter!r}") | |
return greeter_func(name) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment