Что такое замыкание (closure) в Python и как на основе этого механизма работают декораторы? Напишите или объясните, как создать параметризованный декоратор, который сам принимает аргументы.

Замыкание сохраняет доступ к переменным внешней функции после её завершения. Параметризованный декоратор использует три уровня: параметры → функция → вызов обёртки.

Короткий ответ

Что ответить на собеседовании

Замыкание сохраняет доступ к переменным внешней функции после её завершения. Параметризованный декоратор использует три уровня: параметры → функция → вызов обёртки.

Подробный разбор

Ответ с пояснениями

Замыкание сохраняет доступ к переменным внешней функции после её завершения. Параметризованный декоратор использует три уровня: параметры → функция → вызов обёртки.

from functools import wraps

def tagged(label):
    def decorate(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print(label)
            return func(*args, **kwargs)
        return wrapper
    return decorate

@tagged('start')
def add(a, b):
    return a + b

label сохраняется в замыкании фабрики, а func — в замыкании обёртки. Выражение @tagged('start') сначала получает декоратор, затем применяет его к add. wraps сохраняет имя и другие метаданные. Здесь показан синхронный вариант; асинхронному нужен await.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее