Нужно задать таймаут для блока асинхронных операций так, чтобы по истечении времени корректно произошло отмена вложенных await’ов и наверху ловился TimeoutError без «проглатывания» отмен. Что выбрать?
👾 — await asyncio.wait_for(coro, timeout=5)
👍 — async with asyncio.timeout(5): ...
🥰 — signal.alarm(5) в том же потоке
⚡️ — Оборачивать всё в собственный try/except CancelledError
Библиотека задач по Python
👾 — await asyncio.wait_for(coro, timeout=5)
👍 — async with asyncio.timeout(5): ...
🥰 — signal.alarm(5) в том же потоке
⚡️ — Оборачивать всё в собственный try/except CancelledError
Библиотека задач по Python
Какой будет вывод следующего фрагмента кода?
s = {1, 2, 3, 3, 2, 4, 5, 5}
print(s)
👾 — {1, 2, 3, 3, 2, 4, 5, 5}
👍 — {1, 2, 3, 4, 5}
🥰 — None
⚡️ — {1, 5}
Библиотека задач по Python
s = {1, 2, 3, 3, 2, 4, 5, 5}
print(s)
👾 — {1, 2, 3, 3, 2, 4, 5, 5}
👍 — {1, 2, 3, 4, 5}
🥰 — None
⚡️ — {1, 5}
Библиотека задач по Python
Как работает хэш-таблица?
Хэш-таблица в Python реализована в виде словаря (dict). Вот как это работает:
— Хэширование ключей: Когда вы добавляете пару ключ-значение в словарь, Python сначала вычисляет хэш-код ключа с помощью встроенной функции hash(). Хэш-код — это целое число, представляющее «отпечаток» ключа.
— Разрешение коллизий: Если два разных ключа имеют одинаковый хэш-код (коллизия), Python использует механизм разрешения коллизий для размещения значений в памяти. Одним из наиболее распространенных методов разрешения коллизий является метод цепочек, когда для каждого «ячейки» хэш-таблицы выделен список, в который добавляются все значения с одинаковыми хэш-кодами.
— Поиск значения: При поиске значения по ключу Python сначала вычисляет хэш-код ключа и затем использует его для определения соответствующей «ячейки» в хэш-таблице. Затем происходит поиск значения внутри этой «ячейки» (или цепочки).
Библиотека задач по Python
Хэш-таблица в Python реализована в виде словаря (dict). Вот как это работает:
— Хэширование ключей: Когда вы добавляете пару ключ-значение в словарь, Python сначала вычисляет хэш-код ключа с помощью встроенной функции hash(). Хэш-код — это целое число, представляющее «отпечаток» ключа.
— Разрешение коллизий: Если два разных ключа имеют одинаковый хэш-код (коллизия), Python использует механизм разрешения коллизий для размещения значений в памяти. Одним из наиболее распространенных методов разрешения коллизий является метод цепочек, когда для каждого «ячейки» хэш-таблицы выделен список, в который добавляются все значения с одинаковыми хэш-кодами.
— Поиск значения: При поиске значения по ключу Python сначала вычисляет хэш-код ключа и затем использует его для определения соответствующей «ячейки» в хэш-таблице. Затем происходит поиск значения внутри этой «ячейки» (или цепочки).
Библиотека задач по Python
Как работает select_related в Django ORM?
👾 — Выполняет отдельный запрос для каждой связанной модели
👍 — Делает SQL JOIN и подтягивает связанные объекты сразу
🥰 — Кэширует связанные объекты в памяти на уровне Python
⚡️ — Автоматически превращает ForeignKey в ManyToMany
Библиотека задач по Python
👾 — Выполняет отдельный запрос для каждой связанной модели
👍 — Делает SQL JOIN и подтягивает связанные объекты сразу
🥰 — Кэширует связанные объекты в памяти на уровне Python
⚡️ — Автоматически превращает ForeignKey в ManyToMany
Библиотека задач по Python
👍1
Что произойдёт при await asyncio.gather(a(), b(), return_exceptions=False), если a() уже отменена (CancelledError), а b() всё ещё выполняется?
👾 — Вернётся список с CancelledError на месте a(), b() продолжит выполняться
👍 — Будет проброшена CancelledError, при этом gather отменит b() и дождётся её завершения/cleanup
🥰 — Будет проброшена CancelledError, но b() оставят работать в фоне
⚡️ — Поведение не определено и зависит от версии
Библиотека задач по Python
👾 — Вернётся список с CancelledError на месте a(), b() продолжит выполняться
👍 — Будет проброшена CancelledError, при этом gather отменит b() и дождётся её завершения/cleanup
🥰 — Будет проброшена CancelledError, но b() оставят работать в фоне
⚡️ — Поведение не определено и зависит от версии
Библиотека задач по Python
В asyncio родительский таск сделал token = var.set(1) и затем создал два таска t1, t2; в t1 внутри выполняется var.set(2). Как ContextVar ведёт себя по умолчанию?
👾 — Общее на все таски — t1 меняет значение и для родителя, и для t2
👍 — Контекст копируется при создании таска — t1 видит 1, может сменить на 2 только для себя; родитель и t2 остаются с 1
🥰 — Значение видно только в пределах одного await
⚡️ — Требуется вручную вызывать copy_context(), иначе ContextVar не работает
Библиотека задач по Python
👾 — Общее на все таски — t1 меняет значение и для родителя, и для t2
👍 — Контекст копируется при создании таска — t1 видит 1, может сменить на 2 только для себя; родитель и t2 остаются с 1
🥰 — Значение видно только в пределах одного await
⚡️ — Требуется вручную вызывать copy_context(), иначе ContextVar не работает
Библиотека задач по Python
Что делает os.rename()?
В Python функция os.rename() используется для переименования файла или директории в операционной системе. Она входит в модуль os.
Библиотека задач по Python
В Python функция os.rename() используется для переименования файла или директории в операционной системе. Она входит в модуль os.
Библиотека задач по Python
Что делает os.rename()?
В Python функция os.rename() используется для переименования файла или директории в операционной системе. Она входит в модуль os.
Библиотека задач по Python
В Python функция os.rename() используется для переименования файла или директории в операционной системе. Она входит в модуль os.
Библиотека задач по Python
Что верно для Python ≥3.7 про завершение генератора и yield from?
👾 — raise StopIteration(x) эквивалентен return x; yield from игнорирует значение
👍 — Явный raise StopIteration внутри генератора превращается в RuntimeError (PEP 479), а return x задаёт StopIteration.value=x; выражение yield from sub() возвращает это x
🥰 — return x приводит к RuntimeError; корректно только raise StopIteration(x)
⚡️ — yield from всегда возвращает None
Библиотека задач по Python
👾 — raise StopIteration(x) эквивалентен return x; yield from игнорирует значение
👍 — Явный raise StopIteration внутри генератора превращается в RuntimeError (PEP 479), а return x задаёт StopIteration.value=x; выражение yield from sub() возвращает это x
🥰 — return x приводит к RuntimeError; корректно только raise StopIteration(x)
⚡️ — yield from всегда возвращает None
Библиотека задач по Python
В asyncio вы делаете task.cancel(), а внутри корутины стоит:
try:
await do_io()
except Exception:
log("error")
👾 — Отмена не поймается, т.к. CancelledError — потомок BaseException
👍 — Отмена будет поймана этим except, и если не пере-бросить, задача завершится «успехом», фактически проглотив отмену
🥰 — Отмена превратится в TimeoutError
⚡️ — Исключение поднимется мимо except и всегда завершит задачу как отменённую
Библиотека задач по Python
try:
await do_io()
except Exception:
log("error")
👾 — Отмена не поймается, т.к. CancelledError — потомок BaseException
👍 — Отмена будет поймана этим except, и если не пере-бросить, задача завершится «успехом», фактически проглотив отмену
🥰 — Отмена превратится в TimeoutError
⚡️ — Исключение поднимется мимо except и всегда завершит задачу как отменённую
Библиотека задач по Python
Что возвращает a[:] для списка?
👾 — Новую (поверхностную) копию
⚡️ — Ссылку на исходный список
🥰 — Новую глубокую копию
Библиотека задач по Python
👾 — Новую (поверхностную) копию
⚡️ — Ссылку на исходный список
🥰 — Новую глубокую копию
Библиотека задач по Python
🐍 Что такое сцепление исключений?
Сцепление исключений представляет собой метод, который позволяет сохранить первоначальную причину ошибки при её дополнительной обработке.
Когда возникает исключение, его можно перехватить с помощью блока try/except и затем вызвать другое исключение в процессе обработки. При этом первоначальное исключение сохраняется как причина для нового.
Это предоставляет следующие преимущества:
— При обработке нового исключения сохраняется доступ к стеку вызовов и данным первоначального исключения.
— Можно добавить дополнительную информацию в новое исключение, не теряя оригинальных данных.
— Сохраняется иерархия исключений, что позволяет видеть полную цепочку возникновения ошибки.
Библиотека задач по Python
Сцепление исключений представляет собой метод, который позволяет сохранить первоначальную причину ошибки при её дополнительной обработке.
Когда возникает исключение, его можно перехватить с помощью блока try/except и затем вызвать другое исключение в процессе обработки. При этом первоначальное исключение сохраняется как причина для нового.
Это предоставляет следующие преимущества:
— При обработке нового исключения сохраняется доступ к стеку вызовов и данным первоначального исключения.
— Можно добавить дополнительную информацию в новое исключение, не теряя оригинальных данных.
— Сохраняется иерархия исключений, что позволяет видеть полную цепочку возникновения ошибки.
Библиотека задач по Python
Что гарантирует GIL в CPython?
👾 — Отсутствие гонок данных в пользовательском коде
⚡️ — Параллельное выполнение CPU-bound задач в потоках
🥰 — Единовременное выполнение байткода одним потоком интерпретатора
👍 — Что все I/O операции неблокирующие
Библиотека задач по Python
👾 — Отсутствие гонок данных в пользовательском коде
⚡️ — Параллельное выполнение CPU-bound задач в потоках
🥰 — Единовременное выполнение байткода одним потоком интерпретатора
👍 — Что все I/O операции неблокирующие
Библиотека задач по Python
Что делает параметр response_model в декораторе маршрута? (FastAPI)
👾 — Ограничивает типы входных параметров
⚡️ — Валидирует и сериализует ответ, отсекая лишние поля
🥰 — Меняет код ответа по умолчанию
👍 — Включает автодокументацию
Библиотека задач по Python
👾 — Ограничивает типы входных параметров
⚡️ — Валидирует и сериализует ответ, отсекая лишние поля
🥰 — Меняет код ответа по умолчанию
👍 — Включает автодокументацию
Библиотека задач по Python
В каких ситуациях возникает исключение NotImplementedError?
Исключение NotImplementedError возникает, когда метод или функция должны быть реализованы в подклассе, но не были реализованы. Это может произойти, когда родительский класс определяет метод, но не реализует его сам, а оставляет это для подклассов. В этом случае, если подкласс не реализует метод, он будет вызывать исключение NotImplementedError. Это может быть полезно для отладки, чтобы убедиться, что все необходимые методы реализованы в подклассах. Это также может возникнуть в других ситуациях, например, если вы пытаетесь использовать неопределенную функцию или метод.
Библиотека задач по Python
Исключение NotImplementedError возникает, когда метод или функция должны быть реализованы в подклассе, но не были реализованы. Это может произойти, когда родительский класс определяет метод, но не реализует его сам, а оставляет это для подклассов. В этом случае, если подкласс не реализует метод, он будет вызывать исключение NotImplementedError. Это может быть полезно для отладки, чтобы убедиться, что все необходимые методы реализованы в подклассах. Это также может возникнуть в других ситуациях, например, если вы пытаетесь использовать неопределенную функцию или метод.
Библиотека задач по Python
В чем разница между списками и массивами?
Примечание: в стандартной библиотеке Python есть объект array, но здесь мы специально будем обсуждать массив из популярной библиотеки Numpy.
Списки в каждом индексе можно заполнять разными типами данных. Массивы требуют однородных элементов.
Арифметические действия в списках добавляют или удаляют элементы из списка. Арифметические действия на массивах соответствуют функциям линейной алгебры.
Массивы используют меньше памяти и обладают значительно большей функциональностью.
Библиотека задач по Python
Примечание: в стандартной библиотеке Python есть объект array, но здесь мы специально будем обсуждать массив из популярной библиотеки Numpy.
Списки в каждом индексе можно заполнять разными типами данных. Массивы требуют однородных элементов.
Арифметические действия в списках добавляют или удаляют элементы из списка. Арифметические действия на массивах соответствуют функциям линейной алгебры.
Массивы используют меньше памяти и обладают значительно большей функциональностью.
Библиотека задач по Python