uz
Feedback
Python | Вопросы собесов

Python | Вопросы собесов

Kanalga Telegram’da o‘tish

📈 Telegram kanali Python | Вопросы собесов analitikasi

Python | Вопросы собесов (@python_easy_ru) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 13 114 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 9 732-o'rinni va Rossiya mintaqasida 50 668-o'rinni egallagan.

📊 Auditoriya ko‘rsatkichlari va dinamika

невідомо sanasidan buyon loyiha tez o‘sib, 13 114 obunachiga ega bo‘ldi.

05 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -48 ga, so‘nggi 24 soatda esa -5 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.

  • Tasdiqlash holati: Tasdiqlanmagan
  • Jalb etish (ER): Auditoriya o‘rtacha 6.21% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 6.02% ini tashkil etuvchi reaksiyalarni to‘playdi.
  • Post qamrovi: Har bir post o‘rtacha 814 marta ko‘riladi; birinchi sutkada odatda 789 ta ko‘rish yig‘iladi.
  • Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 4 ta reaksiya keladi.
  • Tematik yo‘nalishlar: Kontent ставь, модуль, строка, docker, alice kabi asosiy mavzularga jamlangan.

📝 Tavsif va kontent siyosati

Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
Cайт: easyoffer.ru Реклама: @easyoffer_adv ВП: @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Задачи t.me/+nsl4meWmhfQwNDVi Вакансии t.me/+cXGKkrOY2-w3ZTky

Yuqori yangilanish chastotasi (oxirgi ma’lumot 06 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.

13 114
Obunachilar
-524 soatlar
-147 kunlar
-4830 kunlar
Postlar arxiv
🤔 Что возвращают операторы and, or, not? Они возвращают не обязательно логическое значение, а сам объект, участвующий в выражении. Например, оператор or вернёт первый "правдивый" объект, а and — последний, если все "правдивые". Это поведение используется, например, для задания значений по умолчанию. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какая сложность у пузырьковой сортировки? Пузырьковая сортировка (Bubble Sort) — это один из самых простых, но неэффективных алгоритмов сортировки. 🚩Как работает пузырьковая сортировка? 1. Проходим по массиву несколько раз. 2. На каждой итерации сравниваем соседние элементы и меняем их местами, если они идут не в том порядке. 3. После первого прохода наибольший элемент оказывается в конце массива. 4. Повторяем процесс, пока массив не отсортируется. 🚩Рассчёт сложности (`O(n²)`) Количество сравнений в худшем случае: - На первой итерации: n-1 сравнений - На второй: n-2 сравнений - На третьей: n-3 сравнений - … - Всего: (n-1) + (n-2) + ... + 1 = O(n²) Количество обменов (swap) в худшем случае: - Если массив полностью перевёрнут, на каждой итерации будет максимальное количество перестановок → O(n²). 🚩Оптимизированная пузырьковая сортировка (`O(n)`) Если на проходе по массиву не было перестановок, значит массив уже отсортирован.
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        swapped = False  # Флаг, отслеживающий перестановки
        for j in range(n - i - 1):
            if arr[j] > arr[j + 1]:  # Если элементы в неправильном порядке, меняем местами
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
        if not swapped:
            break  # Если перестановок не было, завершаем сортировку

arr = [1, 2, 3, 4, 5]  # Уже отсортированный массив
bubble_sort(arr)
print(arr)  # [1, 2, 3, 4, 5]
Ставь 👍 и забирай 📚 Базу знаний

Рынок труда в IT в 2026 году это уже не вопрос знаний, а вопрос стратегии. Если ты ищешь работу или думаешь о смене компании,
Рынок труда в IT в 2026 году это уже не вопрос знаний, а вопрос стратегии. Если ты ищешь работу или думаешь о смене компании, стоит отметить канал DevReady. Его ведут инженеры и нанимающие менеджеры из бигтеха. Люди, которые каждый день смотрят резюме и проводят технические интервью. На канале: • разборы реальных резюме и типовых ошибок кандидатов • вопросы с технических интервью и как на них отвечают сильные кандидаты • как использовать AI-инструменты при поиске работы • честный взгляд на рынок и требования компаний в 2026 году Полезные материалы для старта: ➡️ Базовый минимум сильного резюме ➡️ Как отличить хорошую компанию от плохой ➡️ Компания мечты в 2026 году ➡️ Найди работу за 100 рублей 👉 Обязательно подпишись DevReady

🤔 Какая версия HTTP сейчас используется? Актуальные версии: - HTTP/1.1 — долгое время был основным стандартом. - HTTP/2 — быстрее, поддерживает параллельную загрузку, используется в большинстве современных сайтов. - HTTP/3 — новейшая версия, работает поверх QUIC (а не TCP), быстрее и безопаснее. HTTP/2 и HTTP/3 — будущее веба, и большинство крупных сервисов уже их применяют. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как избежать конфликтов при импорте файлов? Когда в проекте много файлов, могут возникать конфликты импортов. Python ищет модули в определённом порядке, и если несколько файлов имеют одинаковые имена или неправильные пути, может возникнуть ошибка. 🚩Способы избежать конфликтов при импорте 🟠Используйте явные пути импорта Вместо
import mymodule  # Может вызвать конфликт, если есть несколько файлов с таким именем
Лучше указывать полный путь в пакетах
from myproject.utils.mymodule import my_function
🟠Избегайте конфликтов имён файлов Если у вас есть файл math.py, импорт import math будет загружать ваш файл, а не стандартный модуль math из Python. - Не называйте файлы именами стандартных модулей: math.py, sys.py, json.py. - Проверьте, какой именно модуль загружается:
  import math
  print(math.__file__)  # Путь к загруженному модулю
  
🟠Добавьте `__init__.py` в пакеты Если у вас есть структура
/myproject
    /utils
        mymodule.py
Решение Добавьте пустой __init__.py в utils/:
/myproject
    /utils
        __init__.py  # Делаем utils пакетом
        mymodule.py
Теперь импорт будет работать
from utils import mymodule
🟠Используйте `sys.path.append()` для указания путей Иногда Python не находит модуль, если он находится вне стандартных путей. Решение Добавьте путь вручную:
import sys
sys.path.append("/path/to/directory")

import mymodule  # Теперь импорт будет работать
🟠Используйте `absolute` и `relative` импорт в пакетах Абсолютный импорт (рекомендуется)
from myproject.utils.mymodule import my_function
Относительный импорт (используется внутри пакетов):
from .mymodule import my_function
🟠Проверяйте `sys.modules` и `sys.path` Если импорт не работает, проверьте, какие модули загружены и где Python ищет файлы
import sys
print(sys.modules.keys())  # Список загруженных модулей
print(sys.path)  # Пути, где Python ищет модули
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое REST? REST (Representational State Transfer) — это архитектурный стиль, используемый при разработке API. Он основывается на принципах HTTP и работе с ресурсами, которые доступны по URL. Каждый запрос клиента должен быть самодостаточным (stateless), а взаимодействие строится с использованием стандартных HTTP-методов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое циклы? Циклы — это конструкции, которые позволяют многократно выполнять код, пока выполняется определённое условие. В Python есть два типа циклов: for — перебирает элементы последовательности (list, tuple, dict, range() и т. д.). while — выполняется, пока условие True. 🚩Цикл `for` (перебор последовательностей) Простой пример for
for i in range(5):
    print(i)
Вывод
0
1
2
3
4
Перебор списка
names = ["Alice", "Bob", "Charlie"]
for name in names:
    print(name)
Вывод
Alice
Bob
Charlie
Перебор словаря (dict)
user = {"name": "Alice", "age": 25}
for key, value in user.items():
    print(f"{key}: {value}")
Вывод
name: Alice
age: 25
🚩Цикл `while` (работает, пока `True`) Пример while
x = 0
while x < 5:
    print(x)
    x += 1
Вывод
0
1
2
3
4
*while с input() (бесконечный цикл)
while True:
    command = input("Введите команду: ")
    if command == "exit":
        break  # Выход из цикла
    print(f"Вы ввели: {command}")
🚩3. Управление циклами (`break`, `continue`) break — выход из цикла
for i in range(10):
    if i == 5:
        break  # Прерывает цикл, если i == 5
    print(i)
Вывод
0
1
2
3
4
continue — пропуск итерации
for i in range(5):
    if i == 2:
        continue  # Пропускаем 2
    print(i)
Вывод
0
1
3
4
🚩`else` в циклах (`for` / `while`) else выполняется, если цикл завершился без break
for i in range(5):
    print(i)
else:
    print("Цикл завершён!")
Вывод
0
1
2
3
4
Цикл завершён!
Но если сработает break, else не выполняется
for i in range(5):
    if i == 3:
        break
    print(i)
else:
    print("Цикл завершён!")  # Не выполнится!
Вывод
0
1
2
Ставь 👍 и забирай 📚 Базу знаний

Неделя бесплатных уроков китайского языка с 19.01 ✨Приглашаем к нам на огненные уроки по китайскому языку всех желающих! Неде
Неделя бесплатных уроков китайского языка с 19.01 ✨Приглашаем к нам на огненные уроки по китайскому языку всех желающих! Неделя бесплатных уроков и лекций продлится с 19 по 25 января 2026г. Хотите поехать в Китай? Учиться в китайском вузе? Пройти стажировку в Шанхае или Пекине? Работать с китайцами? Вам точно к нам! Все расскажем, покажем, а вы потрогаете – китайские учебники, ваши записи иероглифов в тетради. На вкус и цвет уроки разные. Занятия проводятся онлайн. ⚡Количество мест ограничено! Запишитесь прямо сейчас! Записаться #реклама 16+ finskiy-razgovornyy-klub.timepad.ru О рекламодателе

🤔 В каких случаях можно обработать SyntaxError? Обычно SyntaxError возникает до запуска программы, но можно поймать его при динамическом выполнении кода через eval() или exec(). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие бывают виды тестов? Существует несколько видов тестов, каждый из которых имеет свою цель и особенности. 🚩Виды 🟠Юнит-тесты (Unit Tests) Проверка работы отдельных модулей или функций в изоляции от других частей системы. Ориентированы на минимальные части кода (функции, методы, классы). Высокая скорость выполнения. Простота написания и отладки. Обычно пишутся разработчиками.
def add(a, b):
    return a + b

def test_add():
    assert add(1, 2) == 3
🟠Интеграционные тесты (Integration Tests) Проверка взаимодействия между различными модулями или компонентами системы. Тестируют комбинации модулей и их взаимодействие. Более сложные и медленные по сравнению с юнит-тестами. Могут выявить проблемы в интерфейсах между модулями.
def fetch_data_from_api():
    response = requests.get('https://api.example.com/data')
    return response.json()

def test_fetch_data_from_api():
    data = fetch_data_from_api()
    assert 'key' in data
🟠Системные тесты (System Tests) Проверка всей системы целиком на соответствие требованиям. Тестируют систему в рабочей среде. Включают проверку всех функциональных и нефункциональных требований. Могут включать пользовательские сценарии. Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API. 🟠Приемочные тесты (Acceptance Tests) Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя. Часто выполняются вместе с заказчиком или пользователем. Фокусируются на бизнес-требованиях и пользовательских сценариях. Успешное прохождение приемочных тестов является критерием готовности системы к выпуску. Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям. 🟠Регрессионные тесты (Regression Tests) Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале. Выполняются после внесения изменений в код. Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов. Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода. 🟠Нефункциональные тесты (Non-functional Tests) Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др. 🚩Основные виды: 🟠Тесты производительности Измеряют скорость выполнения, пропускную способность и время отклика системы. 🟠Тесты безопасности Оценивают защищенность системы от угроз и атак. 🟠Тесты удобства использования Проверяют удобство и интуитивность пользовательского интерфейса. Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего использовать Makefile в Linux? Makefile используется для автоматизации задач: сборки программ, компиляции, тестирования, упаковки. Это особенно удобно в больших проектах, где одна команда make может запускать цепочку действий с зависимостями. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое оконные функции? Оконные функции (window functions) — это специальные функции в SQL, которые выполняют вычисления по строкам внутри "окна" (группы строк), но не агрегируют их.
SELECT 
    id, 
    месяц, 
    продавец, 
    сумма, 
    SUM(сумма) OVER (PARTITION BY месяц) AS общий_доход_в_месяц
FROM sales;
🟠`ROW_NUMBER()` – Нумерация строк Пронумеруем продажи каждого продавца в порядке убывания суммы.
SELECT 
    id, 
    продавец, 
    сумма, 
    ROW_NUMBER() OVER (PARTITION BY продавец ORDER BY сумма DESC) AS номер
FROM sales;
🟠`RANK()` и `DENSE_RANK()` – Рейтинг с учётом одинаковых значений Если два продавца получили одинаковую сумму, RANK() пропустит следующий номер, а DENSE_RANK() – нет.
SELECT 
    продавец, 
    сумма, 
    RANK() OVER (ORDER BY сумма DESC) AS ранг_1,
    DENSE_RANK() OVER (ORDER BY сумма DESC) AS ранг_2
FROM sales;
🟠3. `LAG()` и `LEAD()` – Доступ к предыдущей и следующей строке LAG() даёт предыдущее значение, LEAD() – следующее.
SELECT 
    месяц, 
    продавец, 
    сумма, 
    LAG(сумма) OVER (PARTITION BY продавец ORDER BY месяц) AS предыдущий_месяц,
    LEAD(сумма) OVER (PARTITION BY продавец ORDER BY месяц) AS следующий_месяц
FROM sales;
🟠Использование оконных функций с `FRAME` (ограничение окна) Иногда нужно анализировать не всю группу, а только несколько соседних строк.
SELECT 
    месяц, 
    продавец, 
    сумма, 
    AVG(сумма) OVER (PARTITION BY продавец ORDER BY месяц ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS скользящее_среднее
FROM sales;
Ставь 👍 и забирай 📚 Базу знаний

🤔 Зачем нужна конструкция yield from? yield from используется в генераторах и позволяет: - делегировать итерацию другому генератору или итерируемому объекту; - упрощает код вложенных генераторов; - эффективно используется в асинхронных корутинах до Python 3.5, до появления async/await. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что случится с сервером при использовании GET? Когда сервер получает HTTP-запрос типа GET, он выполняет следующие действия 🟠Анализ запроса проверяет URL и параметры в строке запроса (например, ?id=123). 🟠Поиск ресурса находит запрашиваемый файл, данные из базы или другой ресурс. 🟠Возврат ответа отправляет данные клиенту (если ресурс найден — код 200, если нет — 404). 🚩Особенности GET-запроса 🟠Безопасный не изменяет данные на сервере, используется только для чтения. 🟠Идемпотентный повторные запросы дают одинаковый результат. 🟠Параметры в URL данные передаются через строку запроса, что не подходит для конфиденциальной информации.
import requests

response = requests.get("https://api.example.com/data", params={"id": 123})
print(response.text)  # Данные с сервера
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие проблемы решает GIL? GIL, или глобальная блокировка интерпретатора, предотвращает одновременное выполнение нескольких потоков в интерпретаторе Python. Это упрощает реализацию интерпретатора и защищает память от ошибок, связанных с конкурентным доступом. Таким образом, он обеспечивает безопасность при многопоточности. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое обработка исключений? Обработка исключений — это механизм в программировании, который позволяет предотвращать аварийное завершение программы, если во время выполнения возникает ошибка. Вместо того чтобы программа просто "упала", обработка исключений дает возможность перехватить ошибку и обработать её безопасным способом. 🚩Почему это нужно? В реальном коде ошибки неизбежны: деление на ноль (ZeroDivisionError), обращение к несуществующему индексу (IndexError), работа с несуществующим файлом (FileNotFoundError) и т. д. 🚩Как это работает? В Python для обработки исключений используется конструкция try-except. Обработка деления на ноль
try:
    x = 10 / 0  # Ошибка: деление на ноль
except ZeroDivisionError:
    print("Ошибка! Деление на ноль невозможно.")
Результат: вместо аварийного завершения программы мы получаем сообщение
Ошибка! Деление на ноль невозможно.
Обработка нескольких типов исключений
try:
    num = int(input("Введите число: "))  # Возможна ошибка ValueError
    result = 10 / num  # Возможна ошибка ZeroDivisionError
except ZeroDivisionError:
    print("Ошибка! Деление на ноль.")
except ValueError:
    print("Ошибка! Введите число.")
Если пользователь введет "abc", программа не завершится с ошибкой, а выведет
Ошибка! Введите число.
Использование finally (код, который выполняется всегда)
try:
    file = open("data.txt", "r")  # Возможна ошибка FileNotFoundError
    content = file.read()
except FileNotFoundError:
    print("Файл не найден!")
finally:
    print("Программа завершена.")  # Выполнится в любом случае
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что известно про арифметический оператор %? Оператор % возвращает остаток от деления одного числа на другое. Используется для проверки чётности, цикличности, деления по модулю и т.д. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое set? Это неупорядоченная коллекция уникальных элементов в Python. Это одна из встроенных структур данных языка, которая используется, когда вам нужно работать с наборами данных, исключая дубликаты и выполняя операции над множествами (например, пересечение, объединение и разность). 🚩Основные характеристики `set` 🟠Неупорядоченность Элементы множества не имеют фиксированного порядка, то есть вы не можете обращаться к элементам по индексу, как в списках или кортежах. 🟠Уникальность элементов Во множестве не может быть дубликатов. Если вы добавите во множество несколько одинаковых элементов, они будут храниться как один экземпляр. 🟠Изменяемость Множества в Python изменяемы: вы можете добавлять, удалять и изменять их элементы. Однако сами элементы множества должны быть неизменяемыми (например, числа, строки, кортежи). 🟠Быстродействие Операции проверки принадлежности (in), добавления и удаления элементов работают очень быстро, благодаря использованию хэш-таблиц в реализации множества. 🚩Создание множества 🟠Пустое множество Для создания пустого множества используется функция set(), так как {} создаёт пустой словарь
empty_set = set()
print(empty_set)  # Output: set()
🟠Создание множества с элементами Вы можете передать список, строку, кортеж или другой итерируемый объект в функцию set().
# Создание множества из списка
numbers = set([1, 2, 3, 4, 5])
print(numbers)  # Output: {1, 2, 3, 4, 5}

# Создание множества из строки (уникальные символы)
chars = set("hello")
print(chars)  # Output: {'h', 'e', 'l', 'o'}  (порядок может быть разным)
🟠Использование литералов Вы также можете использовать фигурные скобки {} для создания множества
fruits = {"apple", "banana", "cherry"}
print(fruits)  # Output: {'apple', 'banana', 'cherry'}
🚩Основные операции с множествами 🟠Добавление элементов Используется метод add()
my_set = {1, 2, 3}
my_set.add(4)
print(my_set)  # Output: {1, 2, 3, 4}
🟠Удаление элементов remove() — удаляет элемент, выбрасывая ошибку, если его нет. discard() — удаляет элемент, не выбрасывая ошибку, если его нет.
my_set = {1, 2, 3}
my_set.remove(2)  # Удаляем элемент 2
print(my_set)  # Output: {1, 3}

my_set.discard(5)  # Ошибки не будет, если элемента 5 нет
pop() — удаляет и возвращает случайный элемент (так как множество неупорядочено)
my_set = {1, 2, 3}
removed_element = my_set.pop()
print(removed_element)  # Например: 1
print(my_set)  # Например: {2, 3}
🟠Очистка множества
my_set = {1, 2, 3}
my_set.clear()
print(my_set)  # Output: set()
🟠Проверка наличия элемента Используется оператор in
my_set = {1, 2, 3}
print(2 in my_set)  # Output: True
print(5 in my_set)  # Output: False
🚩Операции над множествами Python поддерживает классические операции теории множеств: 🟠Объединение (`union` или `|`) Возвращает множество, содержащее все элементы из двух множеств.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1 | set2)  # Output: {1, 2, 3, 4, 5}
print(set1.union(set2))  # То же самое
🟠Пересечение (`intersection` или `&`) Возвращает элементы, которые присутствуют в обоих множествах.
print(set1 & set2)  # Output: {3}
print(set1.intersection(set2))  # То же самое
🟠Разность (`difference` или `-`) Возвращает элементы, которые присутствуют только в одном множестве (а не в другом).
print(set1 - set2)  # Output: {1, 2} (только в set1)
print(set1.difference(set2))  # То же самое
🟠Симметрическая разность (`symmetric_difference` или `^`) Возвращает элементы, которые есть в одном из множеств, но не в обоих сразу.
print(set1 ^ set2)  # Output: {1, 2, 4, 5}
print(set1.symmetric_difference(set2))  # То же самое
🚩Неизменяемое множество (`frozenset`) Если вам нужно создать множество, которое нельзя изменить, используйте frozenset
frozen = frozenset([1, 2, 3])
print(frozen)  # Output: frozenset({1, 2, 3})

# frozen.add(4)  # Ошибка: 'frozenset' object has no attribute 'add'
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как в функцию передаются аргументы, по ссылке или по значению? В Python аргументы передаются по ссылке на объект, но так как типы делятся на изменяемые (списки, словари) и неизменяемые (числа, строки), поведение зависит от типа. Изменяемые объекты могут быть изменены внутри функции, а неизменяемые создают новые экземпляры при попытке их изменить. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Зачем нужны классы BaseExceptionGroup и ExceptionGroup? В Python 3.11 были добавлены новые классы исключений BaseExceptionGroup и ExceptionGroup. Эти классы решают проблему одновременной обработки нескольких исключений, которые могут возникать в сложных ситуациях, таких как асинхронное программирование, многопоточность или обработка нескольких связанных ошибок. Давайте разберем, зачем они нужны, как их использовать и какие преимущества они дают. 🚩Зачем нужны `BaseExceptionGroup` и `ExceptionGroup`? Ранее в Python было возможно выбросить только одно исключение за раз, и обработка нескольких исключений одновременно требовала сложного и неочевидного кода. Например: При работе с асинхронными функциями или потоками может возникнуть сразу несколько ошибок, и их нужно корректно обработать. В больших приложениях или библиотеках (например, при работе с asyncio) может быть необходимость передать сразу несколько исключений, которые произошли в разных местах, как единый объект. BaseExceptionGroup и его подкласс ExceptionGroup позволяют группировать несколько исключений и выбрасывать их вместе в виде одного объекта. Это делает код более читаемым, упрощает обработку и исключает необходимость ручной агрегации ошибок. 🚩Разница между `BaseExceptionGroup` и `ExceptionGroup` BaseExceptionGroup - это базовый класс для группировки исключений. Он наследуется от BaseException и, как правило, не используется напрямую. ExceptionGroup - это подкласс, который наследуется от Exception. Этот класс используется для обработки групп исключений, которые возникают при обычных ошибках в коде (не фатальных). 🚩Как они работают? Классы исключений BaseExceptionGroup и ExceptionGroup позволяют создать "группу исключений", которая содержит несколько отдельных исключений. Это полезно, когда вам нужно: Указать несколько ошибок одновременно. Позволить обработчику исключений работать с каждым из них.
def task_1():
    raise ValueError("Ошибка в задаче 1")

def task_2():
    raise TypeError("Ошибка в задаче 2")

try:
    # Создаем группу исключений
    raise ExceptionGroup(
        "Ошибки в задачах",
        [ValueError("Ошибка в задаче 1"), TypeError("Ошибка в задаче 2")]
    )
except ExceptionGroup as eg:
    for exc in eg.exceptions:
        print(f"Обнаружено исключение: {exc}")
Результат
Обнаружено исключение: Ошибка в задаче 1
Обнаружено исключение: Ошибка в задаче 2
🚩Обработка групп исключений При обработке ExceptionGroup можно использовать механизм фильтрации с помощью конструкции except*. Это нововведение в Python 3.11 позволяет обрабатывать разные типы исключений внутри группы по-разному.
try:
    raise ExceptionGroup(
        "Ошибки в задачах",
        [ValueError("Ошибка 1"), TypeError("Ошибка 2"), ValueError("Ошибка 3")]
    )
except* ValueError as ve:
    print("Обрабатываем ValueError:", ve)
except* TypeError as te:
    print("Обрабатываем TypeError:", te)
Результат
Обрабатываем ValueError: Ошибка 1
Обрабатываем ValueError: Ошибка 3
Обрабатываем TypeError: Ошибка 2
🚩Преимущества использованияРабота с несколькими исключениями одновременно. Вы можете объединить связанные ошибки и передать их в одном объекте. ➕Четкое разграничение типов исключений. Использование except* позволяет обработать каждое исключение из группы отдельно, не теряя гибкости. ➕Удобство при асинхронном программировании. В асинхронных задачах (asyncio) часто возникает несколько ошибок одновременно, и их можно группировать для дальнейшей обработки. ➕Упрощение сложной логики. Код становится проще и понятнее, так как не нужно вручную собирать и разбирать исключения. 🚩Когда использовать? Когда вы работаете с несколькими задачами, которые могут порождать ошибки одновременно (например, асинхронный код). Когда вы хотите сообщить о нескольких связанных ошибках, не выбрасывая каждую из них отдельно. Когда требуется раздельная обработка разных типов ошибок. Ставь 👍 и забирай 📚 Базу знаний