Python | Вопросы собесов
13.9K subscribers
36 photos
1 file
924 links
Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Для чего можно использовать Celery?

1. Это инструмент для выполнения задач в фоновом режиме.
2. Используется для отправки уведомлений, обработки данных, построения отчётов и выполнения длительных операций вне основного потока.
3. Поддерживает планирование задач и распределённую обработку через брокеры, такие как RabbitMQ или Redis.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥2
🤔 Что такое деструктор класса ?

Это специальный метод, который вызывается автоматически при уничтожении объекта класса. Используются для выполнения завершающих действий, таких как освобождение ресурсов, закрытие файлов, освобождение памяти и выполнение других операций очистки перед тем, как объект будет окончательно удалён из памяти.

🚩Деструкторы

Определяется с помощью метода __del__. Этот метод вызывается, когда объект становится недоступным для использования и должен быть удалён сборщиком мусора.
class Person:
def __init__(self, name):
self.name = name
print(f"{self.name} is created")

def __del__(self):
print(f"{self.name} is deleted")

# Создание экземпляра класса Person
person1 = Person("Alice")

# Удаление ссылки на объект
del person1

# Пример с автоматическим вызовом деструктора при завершении программы
person2 = Person("Bob")


🚩Основные функции

🟠Освобождение ресурсов
Используется для освобождения ресурсов, таких как память, файловые дескрипторы, сетевые соединения и другие.

🟠Выполнение завершающих действий
Может выполнять любые завершающие действия, которые необходимо выполнить перед удалением объекта.

🟠Поддержание корректности программы
Помогает избежать утечек памяти и других ресурсов, обеспечивая корректное завершение работы программы.

🚩Особенности

🟠Неопределённое время вызова
Сборщик мусора управляет временем жизни объектов, поэтому точное время вызова деструктора не всегда определено.
🟠Не вызывается для циклических ссылок
Деструкторы не вызываются для объектов, участвующих в циклических ссылках. Для таких случаев рекомендуется использовать модуль weakref.

import weakref

class Node:
def __init__(self, name):
self.name = name
self.next = None
print(f"{self.name} is created")

def __del__(self):
print(f"{self.name} is deleted")

# Создание узлов
node1 = Node("Node1")
node2 = Node("Node2")

# Создание циклической ссылки
node1.next = node2
node2.next = node1

# Удаление узлов (циклическая ссылка предотвратит вызов деструкторов)
del node1
del node2

# Использование слабых ссылок для предотвращения утечек памяти
node1 = Node("Node1")
node2 = Node("Node2")
node1.next = weakref.ref(node2)
node2.next = weakref.ref(node1)

# Удаление узлов (слабые ссылки позволят вызвать деструкторы)
del node1
del node2


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 В чём суть проекта Celery?

Предоставляет систему для распределённого выполнения фоновых задач.
1. Работает с брокерами сообщений (Redis, RabbitMQ) для передачи задач.
2. Позволяет распределять обработку задач между несколькими рабочими процессами (workers).
3. Используется для автоматизации долгих или повторяющихся операций.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🤔 Расскажи о методах len и abs ?

Методы __len__ и abs являются специальными методами (или "магическими методами"), которые позволяют объектам классов взаимодействовать с встроенными функциями и операциями языка. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с стандартными операциями Python.

🚩Метод len

Используется для определения длины объекта. Он должен возвращать количество элементов в объекте. Позволяет объектам взаимодействовать с встроенной функцией len().
class MyCollection:
def __init__(self, items):
self.items = items

def __len__(self):
return len(self.items)

# Использование
my_collection = MyCollection([1, 2, 3, 4, 5])
print(len(my_collection)) # Вывод: 5


🚩Метод abs

Используется для вычисления абсолютного значения объекта. Он должен возвращать абсолютное значение объекта. Позволяет объектам взаимодействовать с встроенной функцией abs().
class MyNumber:
def __init__(self, value):
self.value = value

def __abs__(self):
return abs(self.value)

# Использование
my_number = MyNumber(-10)
print(abs(my_number)) # Вывод: 10


🚩Преимущества

Интеграция с встроенными функциями
Методы len и abs позволяют пользовательским объектам взаимодействовать с встроенными функциями Python, что делает их использование более интуитивно понятным и удобным.

Полиморфизм
Эти методы позволяют использовать объекты классов с функциями и операциями, предназначенными для стандартных типов данных.

Читаемость кода
Использование стандартных функций len() и abs() для пользовательских объектов делает код более понятным и читабельным.

import math

class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __len__(self):
return 2 # Вектор на плоскости всегда имеет два компонента

def __abs__(self):
return math.sqrt(self.x**2 + self.y**2) # Длина (модуль) вектора

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v = Vector(3, 4)
print(len(v)) # Вывод: 2
print(abs(v)) # Вывод: 5.0


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Для чего подходят асинхронные операции?

1. Асинхронные операции подходят для задач с высокой задержкой: сетевые запросы, доступ к базам данных, ввод/вывод файлов.
2. Они повышают производительность за счёт параллельного выполнения задач, не блокируя основной поток.
3. Особенно полезны для приложений с большим числом одновременно обслуживаемых клиентов (например, веб-серверы).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
🤔 Расскажи о методах add , mul , sub , truediv?

Методы add, mul, sub и truediv являются специальными методами (или "магическими методами"), которые позволяют объектам пользовательских классов взаимодействовать с операциями сложения, умножения, вычитания и деления соответственно. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с арифметическими операциями Python.

🟠Метод add
Используется для реализации оператора сложения (+). Он вызывается, когда используется оператор + между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3) # Вывод: Vector(4, 6)


🟠Метод mul
Используется для реализации оператора умножения (*). Он вызывается, когда используется оператор * между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v = Vector(1, 2)
v2 = v * 3
print(v2) # Вывод: Vector(3, 6)


🟠Метод sub
Используется для реализации оператора вычитания (-). Он вызывается, когда используется оператор - между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v1 = Vector(5, 7)
v2 = Vector(2, 3)
v3 = v1 - v2
print(v3) # Вывод: Vector(3, 4)


🟠Метод truediv
Используется для реализации оператора деления (/). Он вызывается, когда используется оператор / между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

# Использование
v = Vector(6, 8)
v2 = v / 2
print(v2) # Вывод: Vector(3.0, 4.0)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Что такое `args`?

Это сокращение для передачи произвольного количества позиционных аргументов в функцию.
1. Указывается как *args в объявлении функции.
2. Позволяет обрабатывать переменное количество аргументов в виде кортежа.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍8💊1
🤔 Расскажи о методе bool?

Метод __bool__ является специальным методом, который позволяет определить, как объект будет оцениваться в логическом контексте. Этот метод должен возвращать булево значение (True или False), которое указывает на истинность или ложность объекта.

🚩Основное предназначение

Используется для реализации логического поведения объектов при использовании встроенной функции bool() и в условиях (например, в инструкциях if и while). Если объект не имеет метода bool, Python вызывает метод len, и если len возвращает ноль, объект считается ложным.
class Box:
def __init__(self, items):
self.items = items

def __bool__(self):
return bool(self.items)

def __repr__(self):
return f"Box({self.items})"

# Использование
box1 = Box([1, 2, 3])
box2 = Box([])

print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False

if box1:
print("box1 is not empty") # Вывод: box1 is not empty

if not box2:
print("box2 is empty") # Вывод: box2 is empty


🚩Использование метода len для логического контекста

Если метод bool не определён, Python использует метод len для определения логического значения объекта. Если метод len возвращает 0, объект считается ложным, в противном случае — истинным.
class Box:
def __init__(self, items):
self.items = items

def __len__(self):
return len(self.items)

def __repr__(self):
return f"Box({self.items})"

# Использование
box1 = Box([1, 2, 3])
box2 = Box([])

print(bool(box1)) # Вывод: True
print(bool(box2)) # Вывод: False

if box1:
print("box1 is not empty") # Вывод: box1 is not empty

if not box2:
print("box2 is empty") # Вывод: box2 is empty


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Что такое `kwargs`?

Это способ передачи произвольного количества именованных аргументов.
1. Указывается как **kwargs в объявлении функции.
2. Аргументы передаются в виде словаря.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥62🤯1💊1
🤔 Расскажи о методах eq, ne, lt, le, qt, qe?

Методы eq, ne, lt, le, gt, и ge являются специальными методами, которые позволяют определять, как объекты пользовательских классов будут сравниваться друг с другом. Эти методы обеспечивают перегрузку операторов сравнения, таких как ==, !=, <, <=, >, и >=.

🟠Метод eq
Используется для перегрузки оператора равенства (==). Он вызывается, когда нужно проверить, равны ли два объекта.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False

# Использование
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 == p2) # Вывод: True
print(p1 == p3) # Вывод: False


🟠Метод name, age
Используется для перегрузки оператора неравенства (!=). Он вызывается, когда нужно проверить, не равны ли два объекта.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __ne__(self, other):
if isinstance(other, Person):
return self.name != other.name or self.age != other.age
return True

# Использование
p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 != p2) # Вывод: False
print(p1 != p3) # Вывод: True


🟠Метод age
Используется для перегрузки оператора "меньше чем" (<). Он вызывается, когда нужно проверить, меньше ли один объект другого.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __lt__(self, other):
if isinstance(other, Person):
return self.age < other.age
return NotImplemented

# Использование
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)

print(p1 < p2) # Вывод: False
print(p2 < p1) # Вывод: True


🟠Метод ass
Используется для перегрузки оператора "меньше или равно" (<=). Он вызывается, когда нужно проверить, меньше ли или равен один объект другому.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __le__(self, other):
if isinstance(other, Person):
return self.age <= other.age
return NotImplemented

# Использование
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
p3 = Person("Charlie", 30)

print(p1 <= p2) # Вывод: False
print(p2 <= p1) # Вывод: True
print(p1 <= p3) # Вывод: True


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💊32
🤔 Что такое аннотации типов?

Это синтаксис для указания типов данных переменных, аргументов и возвращаемого значения функции.
Они служат для повышения читаемости кода и статической проверки типов, но не влияют на выполнение.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
🤔 Какие есть методы у классов ?

Классы могут содержать различные виды методов, которые определяют поведение объектов и взаимодействие с ними.

🟠Обычные методы (Instance Methods)
Работают с экземплярами класса и могут изменять состояние объекта. Они принимают как первый аргумент self, который ссылается на экземпляр класса.
class MyClass:
def __init__(self, value):
self.value = value

def increment(self):
self.value += 1

# Использование
obj = MyClass(10)
obj.increment()
print(obj.value) # Вывод: 11


🟠Методы класса (Class Methods)
Работают с самим классом, а не с экземплярами. Они принимают как первый аргумент cls, который ссылается на класс. Методы класса обозначаются декоратором @classmethod.
class MyClass:
count = 0

def __init__(self):
MyClass.count += 1

@classmethod
def get_count(cls):
return cls.count

# Использование
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.get_count()) # Вывод: 2


🟠Статические методы (Static Methods)
Не зависят ни от экземпляра класса, ни от самого класса. Они не принимают self или cls в качестве первого аргумента. Статические методы обозначаются декоратором @staticmethod.
class MyClass:
@staticmethod
def greet(name):
return f"Hello, {name}!"

# Использование
print(MyClass.greet("Alice")) # Вывод: Hello, Alice!


🚩Специальные методы (Special Methods или Magic Methods)

Специальные методы определяют поведение объектов при использовании встроенных функций и операций. Они включают такие методы, как init, str, repr, len, getitem, setitem, delitem, call, enter, exit, и многие другие.

🟠init
Конструктор класса, вызываемый при создании нового экземпляра.
        class MyClass:
def init(self, value):
self.value = value

obj = MyClass(10)



🟠str
Определяет строковое представление объекта для функции str() и оператора print.
        class MyClass:
def init(self, value):
self.value = value

def str(self):
return f"MyClass with value: {self.value}"

obj = MyClass(10)
print(obj) # Вывод: MyClass with value: 10


🟠__getitem__, __setitem__, __delitem__
Определяют поведение объекта при доступе к элементам по индексу (для коллекций).
    class MyList:
def __init__(self, items):
self.items = items

def __getitem__(self, index):
return self.items[index]

def __setitem__(self, index, value):
self.items[index] = value

def __delitem__(self, index):
del self.items[index]

lst = MyList([1, 2, 3])
print(lst[1]) # Вывод: 2
lst[1] = 20
print(lst[1]) # Вывод: 20
del lst[1]
print(lst.items) # Вывод: [1, 3]


🟠
__enter__, __exit__
Определяют поведение объекта в контексте оператора with.
    ```python
class ManagedResource:
def enter(self):
print("Entering the context")
return self

def exit(self, exc_type, exc_value, traceback):
print("Exiting the context")
return False

with ManagedResource():
print("Inside the context")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91🔥1
🤔 Что такое глубокая копия?

Глубокая копия (deep copy) создаёт новый объект и рекурсивно копирует все вложенные объекты.
Используется, чтобы избежать изменения оригинала при работе с вложенными структурами данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍8
🤔 Как отсортировать список словарей по определенному полю?

Для сортировки списка словарей по определенному полю в Python удобно использовать функцию sorted() или метод sort(). Оба подхода позволяют указать ключ сортировки с помощью параметра key, где можно передать либо функцию, либо лямбда-выражение, которое извлекает значение из словаря для сортировки.

🚩Почему это важно?

Списки словарей часто используются для хранения структурированных данных. Например, вы можете иметь список сотрудников, где каждый сотрудник представлен в виде словаря с полями, такими как имя, возраст и зарплата. Сортировка по определенному полю позволяет упорядочить данные, чтобы ими было проще пользоваться или отображать.

🚩Как это сделать?

🟠Использование функции `sorted()`
Эта функция возвращает новый отсортированный список.
   employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]

# Сортировка по возрасту
sorted_employees = sorted(employees, key=lambda x: x["age"])

print(sorted_employees)


Результат
   [{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]


🟠Использование метода `sort()`
Этот метод изменяет существующий список.
   employees = [
{"name": "Alice", "age": 30, "salary": 70000},
{"name": "Bob", "age": 25, "salary": 50000},
{"name": "Charlie", "age": 35, "salary": 120000}
]

# Сортировка по зарплате
employees.sort(key=lambda x: x["salary"])

print(employees)


Результат
   [{'name': 'Bob', 'age': 25, 'salary': 50000},
{'name': 'Alice', 'age': 30, 'salary': 70000},
{'name': 'Charlie', 'age': 35, 'salary': 120000}]


🟠Сортировка в обратном порядке
Установите параметр reverse=True, чтобы отсортировать в порядке убывания.
   sorted_employees_desc = sorted(employees, key=lambda x: x["age"], reverse=True)
print(sorted_employees_desc)


🟠Использование функции `itemgetter` из модуля `operator`
Это более эффективный способ, чем лямбда-функция, особенно для больших данных.
   from operator import itemgetter

sorted_employees = sorted(employees, key=itemgetter("age"))
print(sorted_employees)


🚩Обработка отсутствующих значений

Если поле может отсутствовать в некоторых словарях, можно использовать параметр key для обработки таких ситуаций.
employees = [
{"name": "Alice", "age": 30},
{"name": "Bob"},
{"name": "Charlie", "age": 35}
]

sorted_employees = sorted(employees, key=lambda x: x.get("age", 0))
print(sorted_employees)


Результат
[{'name': 'Bob'},
{'name': 'Alice', 'age': 30},
{'name': 'Charlie', 'age': 35}]


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤔 Что такое поверхностная копия?

Поверхностная копия (shallow copy) создаёт новый объект, но копирует ссылки на вложенные объекты.
Изменение вложенных данных в копии отразится на оригинале.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
🤔 Чем асинхронность отличается от многопоточности?

Это два подхода, которые используются для выполнения нескольких задач одновременно или для улучшения производительности. Однако они имеют разные концепции, способы реализации и области применения.

🚩Асинхронность

Это способ организации кода, при котором задачи, занимающие много времени (например, ввод/вывод, запросы к базе данных или сетевые операции), не блокируют выполнение остальных частей программы. Основная идея асинхронности заключается в том, чтобы не ждать завершения одной операции перед началом следующей.

🟠Использует один поток
Асинхронный код работает в основном потоке программы и переключается между задачами, когда одна из них ожидает завершения (например, чтения данных из сети).

🟠Ожидание через "event loop"
Асинхронный подход использует цикл событий (event loop), который управляет выполнением задач. Если задача блокируется, цикл событий переключается на следующую задачу.

🟠Неблокирующий ввод/вывод
Асинхронный код не простаивает в ожидании завершения операций ввода/вывода (I/O). Вместо этого такие операции сигнализируют о завершении через "обещание" (например, Future или asyncio.Task).

import asyncio

async def fetch_data():
print("Начинаем загрузку данных...")
await asyncio.sleep(2) # Асинхронная пауза (имитирует длительную операцию)
print("Данные загружены!")
return {"data": "some data"}

async def main():
print("Старт программы")
data = await fetch_data()
print(f"Результат: {data}")
print("Конец программы")

# Запуск цикла событий
asyncio.run(main())


🚩Многопоточность
Это способ выполнения нескольких задач одновременно с использованием нескольких потоков. Потоки — это "легковесные" процессы, которые разделяют одну и ту же память, но могут выполняться независимо друг от друга.

🟠Несколько потоков
Программа создает несколько потоков, каждый из которых выполняет свою задачу.
🟠Параллельное выполнение
Если у процессора несколько ядер, потоки могут выполняться действительно параллельно.
🟠Блокирующий код
В отличие от асинхронного подхода, потоки часто блокируются в ожидании завершения операций (например, I/O).

import threading
import time

def task(name):
print(f"Начало задачи {name}")
time.sleep(2) # Имитация длительной операции
print(f"Конец задачи {name}")

# Создаем и запускаем потоки
thread1 = threading.Thread(target=task, args=("A",))
thread2 = threading.Thread(target=task, args=("B",))

thread1.start()
thread2.start()

# Ожидаем завершения потоков
thread1.join()
thread2.join()
print("Все задачи завершены")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
🤔 Что такое итерируемый объект?

Это объект, который можно перебрать с помощью цикла for.
1. Он должен реализовывать метод __iter__, возвращающий итератор.
2. Примеры: списки, строки, словари, множества.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥3
🤔 Зачем нужны классы 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) часто возникает несколько ошибок одновременно, и их можно группировать для дальнейшей обработки.
Упрощение сложной логики.
Код становится проще и понятнее, так как не нужно вручную собирать и разбирать исключения.

🚩Когда использовать?

Когда вы работаете с несколькими задачами, которые могут порождать ошибки одновременно (например, асинхронный код).
Когда вы хотите сообщить о нескольких связанных ошибках, не выбрасывая каждую из них отдельно.
Когда требуется раздельная обработка разных типов ошибок.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 В чем разница между `copy()` и `deepcopy()`?

1. copy() создаёт поверхностную копию, при которой вложенные объекты остаются общими с оригиналом.
2. deepcopy() создаёт глубокую копию, рекурсивно копируя все вложенные объекты.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍151🔥1