Создание декоратора для добавления параметров

Параметры декоратора можно передавать функции как дополнительные именованные аргументы. Нужно явно определить конфликт имён и убедиться, что функция принимает эти аргументы.

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

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

Параметры декоратора можно передавать функции как дополнительные именованные аргументы. Нужно явно определить конфликт имён и убедиться, что функция принимает эти аргументы.

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

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

Условие

Разработайте декоратор, который будет присваивать функции новые аргументы или параметры. Декоратор должен принимать любые дополнительные значения и делать их доступными внутри функции, к которой применяется.

Ответ

Параметры декоратора можно передавать функции как дополнительные именованные аргументы. Нужно явно определить конфликт имён и убедиться, что функция принимает эти аргументы.

Вариант, запрещающий переопределение внедрённых значений:

from functools import wraps

def inject(**extra):
    def decorate(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if extra.keys() & kwargs.keys():
                raise TypeError('Conflicting injected argument')
            return func(*args, **kwargs, **extra)
        return wrapper
    return decorate

@inject(role='reader')
def describe(name, *, role):
    return f'{name}: {role}'

Внедряемые аргументы здесь сделаны keyword-only. Декоратор не способен автоматически создать неизвестные параметры в сигнатуре произвольной функции: контракт должен их допускать, например через **kwargs.

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

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

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

Подробнее