max_tries = 5 # число попыток
key = -1 # заведомо некорректное значение
for i in range(1, max_tries+1):
key = int(input(f'Попытка №{i}: '))
if key == lock:
print(f'Угадал c {i}-й попытки!')
break
else: # этот else относится к for!
# он выполнится, если for НЕ БЫЛ прерван по break
print('Попытки кончились. =(')
getattr(self, method_name)
) и вызываю оригинальный декоратор на нём с сохранёнными параметрами. Ведь декоратор - это функция, его можно вызывать как функцию.net use
.Вроде обрабатываю исключение на остановку программы
Затем все приводится к формату строки типа ключ=значение
Как можно значение оставить типа float?
import asyncio
import typing
class ThrottledResource:
def __init__(self, delay: float):
self._delay = delay
self._queue = asyncio.Queue()
self._task = None
def start(self):
self._task = asyncio.create_task(self._work_loop)
def stop(self):
self._task.cancel()
self._task = None
# этот метод вызывается клиентским кодом, получает параметры и возвращает отклик спустя время.
async def query(self, params):
future = asyncio.Future() # Future просигналит, когда наш запрос будет обслужен
await self._queue.put((future, params))
result = await future # корутина спит, пока запрос не обслужат
return result
async def _work_loop(self):
while True:
future, params = await. self._queue.get() # ждем, пока не придёт запрос
try:
result = await call_api(params) # тут делаем асинхронное обращение к сервису
except Exception as err:
future.set_exception(err) # была ошибка - теперь await future выкинет исключение
else:
future.set_result(result) # полуен результат - await future вернёт его
self._queue.task_done() # каждому успешному get() соответствует task_done()
asyncio.sleep(self._delay) # можно учесть, сколько времени делался запрос. Но стоит ли?
api = ThrottledResource(delay=1.0)
api.start()
...
result = await api.query(params) # await подождёт, пока не дойдёт очередь до нашего запроса
from sqlite import db_start, create_profile, edit_profile
from main import balance