Создание декоратора, проверяющего, что функция возвращает строку

Используйте 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.

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

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

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

Подробнее