Параметры декоратора можно передавать функции как дополнительные именованные аргументы. Нужно явно определить конфликт имён и убедиться, что функция принимает эти аргументы.
Создание декоратора для добавления параметров
Параметры декоратора можно передавать функции как дополнительные именованные аргументы. Нужно явно определить конфликт имён и убедиться, что функция принимает эти аргументы.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработайте декоратор, который будет присваивать функции новые аргументы или параметры. Декоратор должен принимать любые дополнительные значения и делать их доступными внутри функции, к которой применяется.
Ответ
Параметры декоратора можно передавать функции как дополнительные именованные аргументы. Нужно явно определить конфликт имён и убедиться, что функция принимает эти аргументы.
Вариант, запрещающий переопределение внедрённых значений:
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.