В этой подборке вопросы сгруппированы по формату «Лайвкодинг», чтобы подготовку можно было вести от базовых тем к практическим задачам. В подборке чаще встречаются темы: frontend, browser, database.
Запустите оба ожидания конкурентно, например через asyncio.gather(). Два последовательных await asyncio.sleep(5) дают около 10 секунд, а конкурентный запуск — около 5 секунд плюс накладные расходы.
В коде неверны проверка каталога, имя directory и условие расширений: выражение с != и or истинно для любого файла. Используйте pathlib, is_file() и проверку суффикса через in.
Используйте del items[index], если значение не нужно, или items.pop(index), если хотите его получить. Отрицательный индекс отсчитывается с конца, а выход за границы вызывает IndexError.
Один общий asyncio.Lock должен охватывать проверку и изменение состояния. Это защищает задачи одного event loop, но не несколько процессов, потоков или независимые экземпляры приложения.
Определите доменное исключение с исходным и целевым статусом и поднимайте его до изменения состояния. Оно должно описывать бизнес-ошибку, а не зависеть от конкретного HTTP-фреймворка.
Да, в показанном запуске asyncio.run() завершает асинхронные генераторы, поэтому Cleanup будет напечатано при завершении работы. Но break сам по себе не гарантирует немедленное выполнение finally генератора.
Если требуется число регистраций по дням, фильтруйте последние 30 дней, группируйте по дате и используйте ORDER BY. Схему и часовой пояс нужно задать явно: одно общее число сортировать по дате бессмысленно.
Декоратор может при создании обёртки проверить inspect.iscoroutinefunction и вернуть async wrapper для coroutine-функции, обычный wrapper — для синхронной. Метаданные сохраняют через functools.wraps.
Наиболее надёжен последний вариант с учётом области состояния: атомарная операция Redis для нескольких workers либо asyncio.Lock для одного event loop. Проверка и уменьшение должны составлять одну критическую операцию.
Логический размер файла в Python получают через os.path.getsize(path) или Path(path).stat().st_size — в байтах. Он может отличаться от фактически выделенного места на диске, например у sparse-файла.
В result будет 8. Внешний цикл на последней итерации устанавливает i=9, затем внутренний range(9) последовательно присваивает тому же имени значения от 0 до 8.