Повтор декорированной функции

Сделайте фабрику декоратора repeat(n), вызывайте функцию n раз с одинаковыми аргументами и возвращайте результат последнего вызова. n должен быть целым и не меньше 1.

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

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

Сделайте фабрику декоратора repeat(n), вызывайте функцию n раз с одинаковыми аргументами и возвращайте результат последнего вызова. n должен быть целым и не меньше 1.

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

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

Условие

Написать декоратор, который принимает натуральное число n — число повторений — и будет повторять вызов декорированной функции n раз, а также возвращать значение из последнего вызова.

Ответ

Сделайте фабрику декоратора repeat(n), вызывайте функцию n раз с одинаковыми аргументами и возвращайте результат последнего вызова. n должен быть целым и не меньше 1.

Реализация:

from functools import wraps

def repeat(n):
    if type(n) is not int or n < 1:
        raise ValueError('Expected positive integer')
    def decorate(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            for _ in range(n):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorate

Если вызов выбрасывает исключение, цикл прекращается и ошибка передаётся наружу. Это повторение, не retry. Аргументы не копируются: изменения изменяемого аргумента предыдущим вызовом будут видны следующему. Для внешних побочных эффектов повторять операцию нужно осознанно.

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

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

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

Подробнее