Сделайте фабрику декоратора 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. Аргументы не копируются: изменения изменяемого аргумента предыдущим вызовом будут видны следующему. Для внешних побочных эффектов повторять операцию нужно осознанно.