group-telegram.com/pythonl/4808
Create:
Last Update:
Last Update:
🐍 Задача уровня Pro: декоратор с внутренним состоянием
📌 Задача:
Напиши декоратор call_limiter
, который:
- ограничивает функцию f
максимум до n
вызовов
- после n
вызова функция больше не вызывается, а возвращает строку "LIMIT REACHED"
Пример использования:
@call_limiter(3)
def greet(name):
return f"Hello, {name}!"
print(greet("Alice")) # Hello, Alice!
print(greet("Bob")) # Hello, Bob!
print(greet("Charlie"))# Hello, Charlie!
print(greet("Dave")) # LIMIT REACHED
🎯 Подвохи:
- Нужно создать декоратор-фабрику с аргументом
n
- Внутри должна быть функция с
nonlocal
, чтобы отслеживать число вызовов- Часто путаются и используют
mutable default
, что ломает независимость между декорируемыми функциями✅ Решение:
```python
def call_limiter(n):
def decorator(func):
count = 0
def wrapper(*args, **kwargs):
nonlocal count
if count >= n:
return "LIMIT REACHED"
count += 1
return func(*args, **kwargs)
return wrapper
return decorator
```
🧪 **Проверка:**
```python
def ping():
return "pong"
print(ping()) # pong
print(ping()) # pong
print(ping()) # LIMIT REACHED
def echo(msg):
return msg
print(echo("hi")) # hi
print(echo("bye")) # LIMIT REACHED
```
🧠 **Что проверяет задача:**
• Понимание функций высшего порядка
• Работа с `nonlocal` и областью видимости
• Контроль состояния внутри декоратора
• Умение не "засорить" глобальные или общие области
@pythonl
BY Python/ django
Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260
Share with your friend now:
group-telegram.com/pythonl/4808