Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Это метод тестирования, при котором проверяется работа отдельных модулей или компонентов кода, обычно на уровне функций или методов. Цель юнит-тестирования — убедиться, что каждая часть кода работает правильно независимо от других частей.
Юнит-тесты охватывают небольшие участки кода, такие как отдельные функции или методы.
Тесты выполняются в изолированной среде, что позволяет выявлять проблемы именно в тестируемом модуле без влияния внешних зависимостей.
Юнит-тесты легко автоматизировать, что позволяет быстро проверять изменения в коде.
Юнит-тесты должны выполняться регулярно, например, при каждом изменении кода, чтобы обеспечить его стабильность.
def add(a, b):
return a + b
import unittest
from my_module import add # Импортируем тестируемую функцию из модуля
class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -1), -2)
def test_add_zero(self):
self.assertEqual(add(0, 0), 0)
if __name__ == '__main__':
unittest.main()
python test_add.py
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍15
Это техника в программировании, используемая для замены реальных объектов или компонентов системы временными объектами (моками) во время тестирования. Эти временные объекты имитируют поведение реальных объектов, позволяя изолировать и тестировать отдельные части кода без зависимости от других компонентов системы.
Основные классы для создания мок-объектов.
Декоратор или контекстный менеджер для замены объектов на моки во время выполнения теста.
Простой пример с использованием
Mock
from unittest.mock import Mock
# Создание мок-объекта
mock = Mock()
# Настройка мок-объекта
mock.some_method.return_value = "Mocked Result"
# Вызов метода и проверка результата
result = mock.some_method()
print(result) # Вывод: Mocked Result
Использование
patch
для замены объектовimport unittest
from unittest.mock import patch
# Пример функции, которая вызывает внешний API
def fetch_data():
import requests
response = requests.get("https://example.com/api/data")
return response.json()
# Тестирование функции с использованием patch
class TestFetchData(unittest.TestCase):
@patch('requests.get')
def test_fetch_data(self, mock_get):
# Настройка мок-ответа
mock_get.return_value.json.return_value = {"key": "value"}
# Вызов тестируемой функции
result = fetch_data()
# Проверка результата
self.assertEqual(result, {"key": "value"})
mock_get.assert_called_once_with("https://example.com/api/data")
if __name__ == '__main__':
unittest.main()
Использование
MagicMock
from unittest.mock import MagicMock
# Создание объекта MagicMock
mock = MagicMock()
# Настройка возвращаемого значения для магического метода __str__
mock.__str__.return_value = "MagicMocked String"
print(str(mock)) # Вывод: MagicMocked String
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥15
Относятся к так называемым "магическим методам" или "специальным методам". Они позволяют определять поведение объектов при использовании операторов сложения (+), умножения (*), вычитания (-) и деления (/).
Этот метод отвечает за операцию сложения. Если вы определяете этот метод в вашем классе, вы можете контролировать, что происходит, когда вы используете оператор + между объектами этого класса.
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)
print(v1 + v2) # Вывод: 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)
print(v * 3) # Вывод: 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)
print(v1 - v2) # Вывод: 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(8, 4)
print(v / 2) # Вывод: Vector(4.0, 2.0)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2
Используется для определения логической истинности (truthiness) объекта. Когда вызывается функция
bool()
на объекте или объект используется в контексте, где требуется логическое значение (например, в условиях if), вызывается метод __bool__
. Если метод __bool__
не определен, Python использует метод __len__
: объект считается ложным (False), если его длина равна нулю, и истинным (True) в противном случае.Метод
__bool__
позволяет вам определять, что будет считаться истинным или ложным для объектов вашего класса. Это может быть полезно в различных ситуациях, например, для проверки пустых контейнеров, валидных состояний объектов и т.д.Для того чтобы использовать метод
__bool__
, нужно его определить в своем классе. Метод должен возвращать либо True
, либо False
. В этом примере метод __bool__
проверяет значение атрибута value
. Если value
имеет значение, которое считается ложным (например, 0 или None), метод возвращает False
. В противном случае, он возвращает True
.class MyClass:
def __init__(self, value):
self.value = value
def __bool__(self):
return bool(self.value)
# Примеры использования
obj1 = MyClass(0)
obj2 = MyClass(10)
print(bool(obj1)) # Вывод: False
print(bool(obj2)) # Вывод: True
if obj1:
print("obj1 is True")
else:
print("obj1 is False") # Этот блок выполнится
if obj2:
print("obj2 is True") # Этот блок выполнится
else:
print("obj2 is False")
Допустим, у вас есть класс
Box
, который содержит предметы, и вы хотите, чтобы пустая коробка считалась ложной, а коробка с предметами — истинной.class Box:
def __init__(self, items):
self.items = items
def __bool__(self):
return bool(self.items)
# Примеры использования
empty_box = Box([])
full_box = Box(['item1', 'item2'])
print(bool(empty_box)) # Вывод: False
print(bool(full_box)) # Вывод: True
if empty_box:
print("The box is not empty")
else:
print("The box is empty") # Этот блок выполнится
if full_box:
print("The box is not empty") # Этот блок выполнится
else:
print("The box is empty")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥8❤1
Также относятся к "магическим методам" и используются для перегрузки операторов сравнения. Эти методы позволяют вам определить, как объекты вашего класса будут сравниваться друг с другом с использованием операторов равенства, неравенства, меньше, меньше или равно, больше и больше или равно.
Отвечает за оператор равенства
==
. Он позволяет определить, когда два объекта вашего класса считаются равными.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.name == other.name and self.age == other.age
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):
return self.name != other.name or self.age != other.age
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):
return self.age < other.age
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):
return self.age <= other.age
p1 = Person("Alice", 30)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)
print(p1 <= p2) # Вывод: True
print(p1 <= p3) # Вывод: False
Отвечает за оператор больше
>
. Он позволяет определить, когда один объект вашего класса считается больше другого.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __gt__(self, other):
return self.age > other.age
p1 = Person("Alice", 30)
p2 = Person("Bob", 25)
print(p1 > p2) # Вывод: True
print(p2 > p1) # Вывод: False
Отвечает за оператор больше или равно
>=
. Он позволяет определить, когда один объект вашего класса считается больше или равен другому.class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __ge__(self, other):
return self.age >= other.age
p1 = Person("Alice", 30)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)
print(p1 >= p2) # Вывод: True
print(p1 >= p3) # Вывод: True
print(p3 >= p1) # Вывод: False
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥8😁3💊2
Позволяет объектам вашего класса быть вызываемыми как функции. Когда вы определяете этот метод в своем классе, вы можете использовать экземпляры этого класса как функции.
Полезен, когда вы хотите, чтобы объекты вашего класса могли выполнять какое-то действие при вызове. Это может быть полезно для реализации шаблонов проектирования, таких как замыкания, обработчики событий, или просто для удобства, если объект должен часто выполнять одно и то же действие.
Для того чтобы использовать метод
__call__
, нужно его определить в своем классе. Этот метод может принимать любые аргументы, как и обычные функции.class Counter:
def __init__(self):
self.count = 0
def __call__(self):
self.count += 1
print(f"Count is now {self.count}")
# Примеры использования
counter = Counter()
counter() # Вывод: Count is now 1
counter() # Вывод: Count is now 2
counter() # Вывод: Count is now 3
Пример использования с аргументами
class Adder:
def __init__(self, value):
self.value = value
def __call__(self, x):
return self.value + x
# Примеры использования
add5 = Adder(5)
print(add5(10)) # Вывод: 15
print(add5(20)) # Вывод: 25
Пример более сложного использования
class Polynomial:
def __init__(self, coefficients):
self.coefficients = coefficients
def __call__(self, x):
result = 0
for power, coef in enumerate(self.coefficients):
result += coef * (x ** power)
return result
# Примеры использования
p = Polynomial([1, 0, 2]) # Создает полином 1 + 0x + 2x^2
print(p(2)) # Вывод: 9 (1 + 0*2 + 2*2^2)
print(p(3)) # Вывод: 19 (1 + 0*3 + 2*3^2)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
- `GET` для получения данных с сервера.
- `POST` для отправки данных на сервер (создание ресурса).
- `PUT` для обновления или создания ресурса.
- `DELETE` для удаления ресурса.
- `PATCH` для частичного обновления ресурса.
- `HEAD` для получения заголовков без тела ответа.
- `OPTIONS` для получения информации о поддерживаемых методах.
Эти методы обеспечивают основное взаимодействие клиента и сервера.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍8😁2💊1
Позволяют объектам вашего класса работать как контейнеры, подобные спискам или словарям. Они отвечают за доступ к элементам, установку значений элементов и удаление элементов по индексам или ключам.
Используется для доступа к элементам объекта по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для доступа к элементу.
class MyList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
# Примеры использования
my_list = MyList([1, 2, 3, 4])
print(my_list[0]) # Вывод: 1
print(my_list[2]) # Вывод: 3
Используется для установки значений элементов по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для установки значения элемента.
class MyList:
def __init__(self, items):
self.items = items
def __setitem__(self, index, value):
self.items[index] = value
# Примеры использования
my_list = MyList([1, 2, 3, 4])
my_list[1] = 10
print(my_list.items) # Вывод: [1, 10, 3, 4]
Используется для удаления элементов по индексу или ключу. Он вызывается, когда вы используете синтаксис
del
с квадратными скобками.class MyList:
def __init__(self, items):
self.items = items
def __delitem__(self, index):
del self.items[index]
# Примеры использования
my_list = MyList([1, 2, 3, 4])
del my_list[2]
print(my_list.items) # Вывод: [1, 2, 4]
Пример использования всех методов вместе
class CustomDict:
def __init__(self):
self.data = {}
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
self.data[key] = value
def __delitem__(self, key):
del self.data[key]
# Примеры использования
custom_dict = CustomDict()
custom_dict['a'] = 1
custom_dict['b'] = 2
print(custom_dict['a']) # Вывод: 1
print(custom_dict['b']) # Вывод: 2
del custom_dict['a']
print(custom_dict.data) # Вывод: {'b': 2}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
1. Явно указать в запросе только те столбцы, которые доступны, вместо использования `SELECT *`.
2. Убедиться, что права доступа на уровне пользователя или роли не запрещают чтение нужных столбцов.
3. Использовать средства обработки ошибок в коде, чтобы обрабатывать исключения, если доступ к полю невозможен.
Это помогает избежать ошибок и выполнить запрос успешно.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊7
Используются для поддержки менеджеров контекста. Менеджеры контекста позволяют выполнять подготовительные и завершающие действия вокруг блока кода, используя конструкцию
with
. Это полезно для автоматического управления ресурсами, такими как открытие и закрытие файлов, управление соединениями с базами данных и т. д.Выполняет действия, которые должны произойти в начале блока
with
. Этот метод должен возвращать объект, который будет связан с переменной после оператора as
.Выполняет действия, которые должны произойти в конце блока
with
, даже если в блоке произошло исключение. Он принимает три аргумента: тип исключения, значение исключения и трассировку (traceback). Если исключение не произошло, все три аргумента будут равны None
.class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
# Примеры использования
with FileManager('example.txt', 'w') as f:
f.write('Hello, World!')
# Пример с обработкой исключений
try:
with FileManager('example.txt', 'r') as f:
content = f.read()
print(content)
except Exception as e:
print(f"An error occurred: {e}")
Пример с обработкой ресурсов
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.connection = None
def __enter__(self):
self.connection = self.connect_to_database(self.db_name)
return self.connection
def __exit__(self, exc_type, exc_value, traceback):
if self.connection:
self.connection.close()
def connect_to_database(self, db_name):
# Реализация соединения с базой данных (псевдокод)
print(f"Connecting to database {db_name}")
return f"Connection to {db_name}"
def close(self):
# Реализация закрытия соединения (псевдокод)
print("Closing the connection")
# Примеры использования
with DatabaseConnection('my_database') as conn:
print(conn)
# Выполнение операций с базой данных
# Пример с обработкой исключений
try:
with DatabaseConnection('my_database') as conn:
raise ValueError("Some error occurred")
except Exception as e:
print(f"An error occurred: {e}")
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу Знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19
Используется для создания статических методов в классе. Статический метод — это метод, который не зависит от состояния экземпляра класса и может быть вызван напрямую на классе, не создавая экземпляр. Такие методы обычно используются для выполнения действий, которые логически связаны с классом, но не требуют доступа к его экземплярам или класс-методу.
Статические методы позволяют логически группировать функции, которые имеют отношение к классу, но не требуют доступа к его данным.
Они могут быть вызваны без создания экземпляра класса, что удобно для утилитарных функций.
Помогают держать код более организованным, особенно когда методы имеют логическую связь с классом, но не требуют доступа к его атрибутам или методам.
Для создания статического метода, нужно использовать декоратор
@staticmethod
перед определением метода. В отличие от обычных методов класса, статический метод не принимает параметр self
.class MathUtils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def multiply(a, b):
return a * b
# Вызов статических методов
print(MathUtils.add(5, 3)) # Вывод: 8
print(MathUtils.multiply(5, 3)) # Вывод: 15
Пример использования статического метода для валидации
Здесь метод
is_valid_email
проверяет, является ли строка допустимым email адресом. Поскольку этот метод не требует доступа к состоянию экземпляра класса, его логично сделать статическим.class Validator:
@staticmethod
def is_valid_email(email):
return "@" in email and "." in email
# Вызов статического метода
print(Validator.is_valid_email("[email protected]")) # Вывод: True
print(Validator.is_valid_email("invalid-email")) # Вывод: False
Принимают параметр
self
, который указывает на текущий экземпляр класса.Принимают параметр
cls
, который указывает на сам класс, и могут изменять состояние класса.Не принимают ни
self
, ни cls
, что делает их более похожими на обычные функции, но логически сгруппированными в классе.Пример для сравнения:
class Example:
def instance_method(self):
print("This is an instance method")
@classmethod
def class_method(cls):
print("This is a class method")
@staticmethod
def static_method():
print("This is a static method")
# Создание экземпляра класса
obj = Example()
# Вызов методов
obj.instance_method() # Вывод: This is an instance method
Example.class_method() # Вывод: This is a class method
Example.static_method() # Вывод: This is a static method
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥3
Это декоратор, предоставленный модулем
dataclasses
, который автоматически генерирует специальные методы, такие как __init__
, __repr__
, __eq__
, и другие, для вашего класса. Это упрощает создание классов, предназначенных для хранения данных, устраняя необходимость писать много шаблонного кода.Автоматически генерирует методы, сокращая шаблонный код.
Делает код более чистым и легким для понимания.
Обеспечивает удобные и мощные возможности для работы с данными.
Нужно импортировать его из модуля
dataclasses
и применить к классу. Внутри класса достаточно определить только поля данных.from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
# Примеры использования
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)
print(person1) # Вывод: Person(name='Alice', age=30)
print(person2) # Вывод: Person(name='Bob', age=25)
print(person1 == person2) # Вывод: False
Инициализирует объект с заданными значениями атрибутов.
Возвращает строковое представление объекта, удобное для отладки.
Сравнивает объекты на равенство по их атрибутам.
Могут быть сгенерированы для сравнения объектов (если указано).
Вы можете настроить поведение
@dataclass
с помощью параметров, таких как order
, frozen
, и других.Генерирует методы для сравнения объектов.
Делает экземпляры неизменяемыми (immutable).
Пример
from dataclasses import dataclass
@dataclass(order=True, frozen=True)
class Person:
name: str
age: int
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)
print(person1 > person2) # Вывод: True (поскольку 'Alice' > 'Bob' по алфавиту, если имена равны, сравниваются возраста)
# person1.age = 31 # Ошибка: FrozenInstanceError (поскольку класс заморожен)
Вы можете использовать функцию
field()
для настройки отдельных полей, например, для указания значений по умолчанию или исключения полей из методов __repr__
, __eq__
, и других.from dataclasses import dataclass, field
@dataclass
class Person:
name: str
age: int = 0
address: str = field(default="Unknown", repr=False)
person = Person(name="Alice")
print(person) # Вывод: Person(name='Alice', age=0)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1