Наполните свой код Python декораторами: руководство для начинающих

Привет, товарищи питонисты! Сегодня мы окунемся в удивительный мир декораторов. Если вы когда-нибудь задавались вопросом, как добавить дополнительную функциональность в ваш код Python, не загромождая его, декораторы помогут вам. В этой статье мы рассмотрим различные методы использования декораторов с множеством примеров кода и разговорными объяснениями, которые сделают процесс интересным и увлекательным. Итак, возьмите свой любимый напиток с кофеином и начнем!

  1. Время выполнения с помощью простого декоратора:
    Вы когда-нибудь хотели знать, сколько времени занимает выполнение функции? В этом могут помочь декораторы! Посмотрите этот отличный пример:
import time
def timer(func):
    def wrapper(*args, kwargs):
        start_time = time.time()
        result = func(*args, kwargs)
        end_time = time.time()
        print(f"Execution time of {func.__name__}: {end_time - start_time} seconds")
        return result
    return wrapper
@timer
def slow_function():
    # Simulating a time-consuming task
    time.sleep(3)
    print("Function execution complete")
slow_function()
  1. Добавление журналирования в функции.
    Устранение неполадок может быть хлопотным, особенно если вы не знаете, что происходит внутри ваших функций. Декораторы могут прийти на помощь, предоставив простой способ добавления возможностей ведения журнала. Вот пример:
def log_func(func):
    def wrapper(*args, kwargs):
        print(f"Calling function: {func.__name__}")
        result = func(*args, kwargs)
        print(f"Function {func.__name__} execution complete")
        return result
    return wrapper
@log_func
def greet(name):
    print(f"Hello, {name}!")
greet("Alice")
  1. Реализация проверок авторизации.
    Нужно защитить определенные части вашего кода? Декораторы могут помочь вам реализовать проверки авторизации без дублирования кода. Взгляните на этот пример:
def requires_permission(permission):
    def decorator(func):
        def wrapper(*args, kwargs):
            if check_permission(permission):
                return func(*args, kwargs)
            else:
                print("Access denied!")
        return wrapper
    return decorator
@requires_permission("admin")
def admin_only_function():
    print("This function can only be accessed by admins")
admin_only_function()
  1. Мемоизация для ускорения вычислений.
    Мемоизация — это метод кэширования результатов функций для повышения производительности. Декораторы могут упростить реализацию запоминания. Посмотрите этот пример:
def memoize(func):
    cache = {}
    def wrapper(*args):
        if args in cache:
            return cache[args]
        result = func(*args)
        cache[args] = result
        return result
    return wrapper
@memoize
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(10))

И вот оно — просто пример того, что декораторы могут сделать с вашим кодом Python. От синхронизации выполнения до добавления журналирования, реализации проверок авторизации и даже ускорения вычислений с помощью мемоизации — декораторы предлагают безграничные возможности для улучшения вашей кодовой базы. Так что давайте, попробуйте, и ваш код засияет как никогда раньше!