Я хотел бы написать декоратор, который ограничивает количество вызовов обернутой функции. Скажем, если я хочу, чтобы завернутая функция была вызвана максимум 10 раз, декоратор должен выполнить эту функцию первые 10 раз, тогда она должна вместо этого вернуть None
.Декодер Python для ограничения числа вызовов
Вот что я придумал:
from functools import wraps
def max_calls(num):
"""Decorator which allows its wrapped function to be called `num` times"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
calls = getattr(wrapper, 'calls', 0)
calls += 1
if calls == num:
return None
setattr(wrapper, 'calls', calls)
return func(*args, **kwargs)
setattr(wrapper, 'calls', 0)
return wrapper
return decorator
Однако этот счетчик вызовов правильно, возвращает None
при достижении предела, но ... это не сбрасывается между работает программа. То есть, если я выполняю программу один раз, счетчик достигает 5, а затем повторно запускает программу, она продолжается с 5. Что мне нужно изменить, чтобы декоратор работал правильно?
На моей машине счетчик сбрасывается, как ожидалось, когда я запускаю сценарий во второй раз. Как вы выполняете свой скрипт? Я предполагаю, что вы не выполняете 'python myscript.py' из командной строки. – Kevin
'То есть, если я выполняю программу один раз, счетчик достигает 5, а затем повторно запускает программу, она продолжается с 5' .. не могли бы вы объяснить, как вы выполняете программу? – Abhijit
Вы работаете внутри интерпретатора python? –