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
1. Работает с брокерами сообщений (Redis, RabbitMQ) для передачи задач.
2. Позволяет распределять обработку задач между несколькими рабочими процессами (workers).
3. Используется для автоматизации долгих или повторяющихся операций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Методы
__len__
и abs являются специальными методами (или "магическими методами"), которые позволяют объектам классов взаимодействовать с встроенными функциями и операциями языка. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с стандартными операциями Python.Используется для определения длины объекта. Он должен возвращать количество элементов в объекте. Позволяет объектам взаимодействовать с встроенной функцией
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()
.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
Forwarded from easyoffer
easyoffer
Backend
Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты
Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты
Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты
Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты
Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты
C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты
C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты
Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты
DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты
PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты
Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты
Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты
Please open Telegram to view this post
VIEW IN TELEGRAM
💊2
2. Они повышают производительность за счёт параллельного выполнения задач, не блокируя основной поток.
3. Особенно полезны для приложений с большим числом одновременно обслуживаемых клиентов (например, веб-серверы).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
Методы add, mul, sub и truediv являются специальными методами (или "магическими методами"), которые позволяют объектам пользовательских классов взаимодействовать с операциями сложения, умножения, вычитания и деления соответственно. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с арифметическими операциями Python.
Используется для реализации оператора сложения (
+
). Он вызывается, когда используется оператор +
между двумя объектами.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)
Используется для реализации оператора умножения (
*
). Он вызывается, когда используется оператор *
между двумя объектами.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)
Используется для реализации оператора вычитания (
-
). Он вызывается, когда используется оператор -
между двумя объектами.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)
Используется для реализации оператора деления (
/
). Он вызывается, когда используется оператор /
между двумя объектами.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
Это сокращение для передачи произвольного количества позиционных аргументов в функцию.
1. Указывается как *args в объявлении функции.
2. Позволяет обрабатывать переменное количество аргументов в виде кортежа.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍8💊1
Метод
__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
Если метод 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
Это способ передачи произвольного количества именованных аргументов.
1. Указывается как **kwargs в объявлении функции.
2. Аргументы передаются в виде словаря.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥6❤2🤯1💊1
Методы eq, ne, lt, le, gt, и ge являются специальными методами, которые позволяют определять, как объекты пользовательских классов будут сравниваться друг с другом. Эти методы обеспечивают перегрузку операторов сравнения, таких как
==
, !=
, <
, <=
, >
, и >=
.Используется для перегрузки оператора равенства (
==
). Он вызывается, когда нужно проверить, равны ли два объекта.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
Используется для перегрузки оператора неравенства (
!=
). Он вызывается, когда нужно проверить, не равны ли два объекта.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
Используется для перегрузки оператора "меньше чем" (
<
). Он вызывается, когда нужно проверить, меньше ли один объект другого.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
Используется для перегрузки оператора "меньше или равно" (
<=
). Он вызывается, когда нужно проверить, меньше ли или равен один объект другому.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💊3❤2
Они служат для повышения читаемости кода и статической проверки типов, но не влияют на выполнение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Классы могут содержать различные виды методов, которые определяют поведение объектов и взаимодействие с ними.
Работают с экземплярами класса и могут изменять состояние объекта. Они принимают как первый аргумент
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
Работают с самим классом, а не с экземплярами. Они принимают как первый аргумент
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
Не зависят ни от экземпляра класса, ни от самого класса. Они не принимают self или cls в качестве первого аргумента. Статические методы обозначаются декоратором @staticmethod.
class MyClass:
@staticmethod
def greet(name):
return f"Hello, {name}!"
# Использование
print(MyClass.greet("Alice")) # Вывод: Hello, Alice!
Специальные методы определяют поведение объектов при использовании встроенных функций и операций. Они включают такие методы, как init, str, repr, len, getitem, setitem, delitem, call, enter, exit, и многие другие.
Конструктор класса, вызываемый при создании нового экземпляра.
class MyClass:
def init(self, value):
self.value = value
obj = MyClass(10)
Определяет строковое представление объекта для функции 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
Определяют поведение объекта при доступе к элементам по индексу (для коллекций).
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
👍9❤1🔥1
Используется, чтобы избежать изменения оригинала при работе с вложенными структурами данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍8
Для сортировки списка словарей по определенному полю в Python удобно использовать функцию sorted() или метод sort(). Оба подхода позволяют указать ключ сортировки с помощью параметра key, где можно передать либо функцию, либо лямбда-выражение, которое извлекает значение из словаря для сортировки.
Списки словарей часто используются для хранения структурированных данных. Например, вы можете иметь список сотрудников, где каждый сотрудник представлен в виде словаря с полями, такими как имя, возраст и зарплата. Сортировка по определенному полю позволяет упорядочить данные, чтобы ими было проще пользоваться или отображать.
Эта функция возвращает новый отсортированный список.
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}]
Этот метод изменяет существующий список.
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)
Это более эффективный способ, чем лямбда-функция, особенно для больших данных.
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
Изменение вложенных данных в копии отразится на оригинале.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
Это два подхода, которые используются для выполнения нескольких задач одновременно или для улучшения производительности. Однако они имеют разные концепции, способы реализации и области применения.
Это способ организации кода, при котором задачи, занимающие много времени (например, ввод/вывод, запросы к базе данных или сетевые операции), не блокируют выполнение остальных частей программы. Основная идея асинхронности заключается в том, чтобы не ждать завершения одной операции перед началом следующей.
Асинхронный код работает в основном потоке программы и переключается между задачами, когда одна из них ожидает завершения (например, чтения данных из сети).
Асинхронный подход использует цикл событий (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
1. Он должен реализовывать метод __iter__, возвращающий итератор.
2. Примеры: списки, строки, словари, множества.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥3
В Python 3.11 были добавлены новые классы исключений
BaseExceptionGroup
и ExceptionGroup
. Эти классы решают проблему одновременной обработки нескольких исключений, которые могут возникать в сложных ситуациях, таких как асинхронное программирование, многопоточность или обработка нескольких связанных ошибок. Давайте разберем, зачем они нужны, как их использовать и какие преимущества они дают.Ранее в Python было возможно выбросить только одно исключение за раз, и обработка нескольких исключений одновременно требовала сложного и неочевидного кода. Например:
При работе с асинхронными функциями или потоками может возникнуть сразу несколько ошибок, и их нужно корректно обработать.
В больших приложениях или библиотеках (например, при работе с
asyncio
) может быть необходимость передать сразу несколько исключений, которые произошли в разных местах, как единый объект.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
2. deepcopy() создаёт глубокую копию, рекурсивно копируя все вложенные объекты.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤1🔥1