Используйте wraps, передайте все аргументы исходной функции и проверьте результат через isinstance(result, str). При нарушении контракта поднимите TypeError.
Создание декоратора, проверяющего, что функция возвращает строку
Используйте wraps, передайте все аргументы исходной функции и проверьте результат через isinstance(result, str). При нарушении контракта поднимите TypeError.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Напишите декоратор returns_string, который после выполнения функции проверяет, что её результат имеет тип str. Если полученное значение не является строкой, декоратор должен вызвать исключение TypeError. При этом декоратор обязан сохранять оригинальное имя функции и её docstring, а также корректно работать с функциями, принимающими произвольное количество позиционных и именованных аргументов.
Ответ
Используйте wraps, передайте все аргументы исходной функции и проверьте результат через isinstance(result, str). При нарушении контракта поднимите TypeError.
from functools import wraps
def returns_string(func):
@wraps(func)
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
if not isinstance(result, str):
raise TypeError(f'{func.__name__} должна возвращать str')
return result
return wrapper
Пустая строка является корректным результатом, поэтому проверка истинности здесь не подходит. isinstance также допускает подклассы str; если нужен только точный встроенный тип, используйте type(result) is str.
Исключения самой функции распространяются без изменения. Для асинхронной функции понадобится отдельная обёртка, проверяющая значение после await.