Как модифицировать функцию `info_start_tasks`, чтобы ошибка 'NoneType' object has no attribute 'cancel' в строке `task.cancel()` не возникала при условии, что параметр `next_stage` не равен `None`? Я также хочу, чтобы отложенные сообщения, отправляемые через `asyncio.sleep`, не сбрасывались при вызове функции с `next_stage!=None`.
Ошибка 'NoneType' object has no attribute 'cancel' возникает потому, что функция asyncio.current_task() может вернуть None, если код выполняется не в контексте задачи asyncio. Поэтому нужно проверять перед вызовом метода cancel(), что переменная task не является None. Для модификации функции `info_start_tasks` можно переписать ее следующим образом: ```python import asyncio async def info_start_tasks(next_stage=None): tasks = [] # Создаем отложенные сообщения for i in range(3): msg = f"Message {i+1}" tasks.append(asyncio.create_task(print_message(msg))) # Если задан параметр next_stage, запускаем следующий этап if next_stage: await asyncio.sleep(5) async with next_stage: # Добавляем проверку на None перед отменой задачи for task in tasks: if task: task.cancel() async def print_message(msg): await asyncio.sleep(1) print(msg) # Пример вызова функции asyncio.run(info_start_tasks(next_stage=True)) ``` В этой версии функции `info_start_tasks` добавлена проверка на None перед вызовом метода cancel() для каждой задачи в списке tasks. Также добавлено условие, что если параметр next_stage не равен None, то отложенные сообщения не будут сброшены при вызове функции с next_stage=True.
Цитата из документации :
Return the currently running Task instance, or None if no task is running.
Как я это понимаю, если ты запланировал выполнение функции как задачи через asyncio.create_task(), то эта функция, и все, вызываемые в ней, смогут получить объект задачи, вызвав asyncio.current_task().
Если же управление в текущую функции было передано без использования задач на любом из уровней, только через await вызовы, то current_task() вернёт None.