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

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Какие области в профессиональной деятельности у тебя развиты слабо

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥8😁3💊2
🤔 Методы call?

Позволяет объектам вашего класса быть вызываемыми как функции. Когда вы определяете этот метод в своем классе, вы можете использовать экземпляры этого класса как функции.

🚩Зачем нужен

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

🚩Как использовать

Для того чтобы использовать метод __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
🤔 Какие основные HTTP методы знаешь?

Основные HTTP методы включают:
- `GET` для получения данных с сервера.
- `POST` для отправки данных на сервер (создание ресурса).
- `PUT` для обновления или создания ресурса.
- `DELETE` для удаления ресурса.
- `PATCH` для частичного обновления ресурса.
- `HEAD` для получения заголовков без тела ответа.
- `OPTIONS` для получения информации о поддерживаемых методах.
Эти методы обеспечивают основное взаимодействие клиента и сервера.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍8😁2💊1
🤔 Методы getitem и setitem и delitem?

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

🟠Метод `getitem`
Используется для доступа к элементам объекта по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для доступа к элементу.
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


🟠Метод `setitem`
Используется для установки значений элементов по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для установки значения элемента.
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]


🟠Метод `delitem`
Используется для удаления элементов по индексу или ключу. Он вызывается, когда вы используете синтаксис 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
👍91
🤔 Как пропустить заблокированные поля в БД при использовании select?

Чтобы пропустить заблокированные поля в БД при выполнении запроса `SELECT`, можно:
1. Явно указать в запросе только те столбцы, которые доступны, вместо использования `SELECT *`.
2. Убедиться, что права доступа на уровне пользователя или роли не запрещают чтение нужных столбцов.
3. Использовать средства обработки ошибок в коде, чтобы обрабатывать исключения, если доступ к полю невозможен.
Это помогает избежать ошибок и выполнить запрос успешно.


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

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

🟠Метод `enter`
Выполняет действия, которые должны произойти в начале блока with. Этот метод должен возвращать объект, который будет связан с переменной после оператора as.

🟠Метод `exit`
Выполняет действия, которые должны произойти в конце блока 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
👍91
🤔 Какие есть типы данных в Python?

В Python существует несколько встроенных типов данных: числовые типы (int, float, complex), строки (str), булевы значения (bool), списки (list), кортежи (tuple), множества (set) и словари (dict). Также есть типы для работы с бинарными данными, такие как bytes и bytearray. Кроме того, существуют пользовательские типы, которые можно создавать с помощью классов. Python поддерживает динамическую типизацию, где тип переменной определяется автоматически при присваивании значения.

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

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

🚩Зачем нужен

🟠Организация кода
Статические методы позволяют логически группировать функции, которые имеют отношение к классу, но не требуют доступа к его данным.
🟠Удобство использования
Они могут быть вызваны без создания экземпляра класса, что удобно для утилитарных функций.
🟠Читабельность и структуризация
Помогают держать код более организованным, особенно когда методы имеют логическую связь с классом, но не требуют доступа к его атрибутам или методам.

🚩Как использовать

Для создания статического метода, нужно использовать декоратор @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("test@example.com")) # Вывод: 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
👍101
🤔 Что такое итератор?

Итератор в Python — это объект, который поддерживает метод `__iter__()` и `__next__()` для последовательного перебора элементов коллекции. Итераторы используются для работы с циклами и обеспечивают ленивую генерацию данных, не загружая их все сразу в память. Каждый вызов метода `next()` возвращает следующий элемент, а при отсутствии элементов вызывается исключение `StopIteration`. Итераторы полезны для работы с большими данными и потоками данных.

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

Это декоратор, предоставленный модулем 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


🚩Автоматически генерируемые методы

🟠`__init__`
Инициализирует объект с заданными значениями атрибутов.
🟠`__repr__`
Возвращает строковое представление объекта, удобное для отладки.
🟠`__eq__`
Сравнивает объекты на равенство по их атрибутам.
🟠`__lt__`, `__le__`, `__gt__`, `__ge__`
Могут быть сгенерированы для сравнения объектов (если указано).

🚩Настройка поведения

Вы можете настроить поведение @dataclass с помощью параметров, таких как order, frozen, и других.

🟠`order=True`
Генерирует методы для сравнения объектов.
🟠`frozen=True`
Делает экземпляры неизменяемыми (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
👍141
🤔 Расскажи о сложностях с которыми столкнулась во время обучения?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1💊9🔥5😁1
🤔 Чем отличается атрибут класса от атрибута объекта?

Различаются по своему назначению и области видимости. Понимание этих различий важно для правильного проектирования классов и управления данными.

🚩Атрибуты класса

Являются общими для всех экземпляров класса. Они определяются внутри класса, но вне любого метода. Эти атрибуты могут быть доступны и изменены как через сам класс, так и через любой его экземпляр.
class MyClass:
class_attribute = 42 # Атрибут класса

# Доступ к атрибуту класса
print(MyClass.class_attribute) # Вывод: 42

# Создание экземпляров
obj1 = MyClass()
obj2 = MyClass()

# Доступ к атрибуту класса через экземпляры
print(obj1.class_attribute) # Вывод: 42
print(obj2.class_attribute) # Вывод: 42

# Изменение атрибута класса
MyClass.class_attribute = 100
print(obj1.class_attribute) # Вывод: 100
print(obj2.class_attribute) # Вывод: 100


🚩Атрибуты объекта (экземпляра)

Уникальны для каждого экземпляра класса. Они определяются внутри методов класса, обычно в методе __init__, и относятся к конкретному экземпляру.
class MyClass:
def __init__(self, value):
self.instance_attribute = value # Атрибут объекта

# Создание экземпляров
obj1 = MyClass(10)
obj2 = MyClass(20)

# Доступ к атрибутам объекта
print(obj1.instance_attribute) # Вывод: 10
print(obj2.instance_attribute) # Вывод: 20

# Изменение атрибутов объекта
obj1.instance_attribute = 15
print(obj1.instance_attribute) # Вывод: 15
print(obj2.instance_attribute) # Вывод: 20


🚩Ключевые различия

🟠Область видимости и доступ
Атрибуты класса видны и доступны для всех экземпляров класса. Атрибуты объекта видны и доступны только для конкретного экземпляра.

🟠Инициализация и использование
Атрибуты класса инициализируются при определении класса и общие для всех экземпляров. Атрибуты объекта инициализируются в методе __init__ и уникальны для каждого экземпляра.

🟠Изменение значений
Изменение атрибута класса через класс изменяет его для всех экземпляров. Изменение атрибута объекта влияет только на конкретный экземпляр.

🚩Пример различий

class MyClass:
class_attribute = 'class value'

def __init__(self, value):
self.instance_attribute = value

# Создание экземпляров
obj1 = MyClass('instance value 1')
obj2 = MyClass('instance value 2')

# Доступ к атрибутам класса и объекта
print(MyClass.class_attribute) # Вывод: class value
print(obj1.class_attribute) # Вывод: class value
print(obj2.class_attribute) # Вывод: class value

print(obj1.instance_attribute) # Вывод: instance value 1
print(obj2.instance_attribute) # Вывод: instance value 2

# Изменение атрибута класса через класс
MyClass.class_attribute = 'new class value'
print(obj1.class_attribute) # Вывод: new class value
print(obj2.class_attribute) # Вывод: new class value

# Изменение атрибута объекта
obj1.instance_attribute = 'new instance value 1'
print(obj1.instance_attribute) # Вывод: new instance value 1
print(obj2.instance_attribute) # Вывод: instance value 2


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

Основные методы: GET для получения данных, POST для отправки данных, PUT для обновления или создания ресурса, DELETE для удаления. Также используются PATCH для частичного обновления, HEAD для получения заголовков и OPTIONS для определения доступных методов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍7
🤔 Геттеры и сеттеры, property атрибуты?

Используются для контроля доступа к атрибутам класса. Они позволяют вам добавлять логику при получении (геттер) и изменении (сеттер) значений атрибутов. В Python эти методы можно реализовать с помощью функции property, которая упрощает создание геттеров и сеттеров, делая код более читабельным и идиоматичным.

🚩Геттеры и сеттеры

Геттер — это метод, который возвращает значение атрибута, а сеттер — метод, который устанавливает значение атрибута.
Пример без использования property
class MyClass:
def __init__(self, value):
self._value = value # Приватный атрибут

def get_value(self):
return self._value

def set_value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")

# Примеры использования
obj = MyClass(10)
print(obj.get_value()) # Вывод: 10

obj.set_value(20)
print(obj.get_value()) # Вывод: 20

try:
obj.set_value(-10) # Пример вызова исключения
except ValueError as e:
print(e) # Вывод: Value must be non-negative


🚩`property` атрибуты

Можно использовать функцию property, чтобы избежать явных вызовов геттеров и сеттеров и сделать код более естественным и читаемым. property позволяет определить методы доступа как атрибуты.
Пример с использованием property
class MyClass:
def __init__(self, value):
self._value = value

@property
def value(self):
return self._value

@value.setter
def value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")

# Примеры использования
obj = MyClass(10)
print(obj.value) # Вывод: 10 (используется геттер)

obj.value = 20
print(obj.value) # Вывод: 20 (используется сеттер)

try:
obj.value = -10 # Пример вызова исключения через сеттер
except ValueError as e:
print(e) # Вывод: Value must be non-negative


🚩Плюсы

Инкапсуляция
Позволяет скрыть реализацию и управлять доступом к данным через методы, что делает код более безопасным и гибким.
Читабельность
Код выглядит как работа с обычными атрибутами, а не методами, что упрощает его понимание.
Контроль
Легко добавить валидацию или логику при установке или получении значений.

🚩Полный пример с геттером, сеттером и делетером

Также можно использовать декоратор @property для создания делетера (удаления атрибута).
class MyClass:
def __init__(self, value):
self._value = value

@property
def value(self):
return self._value

@value.setter
def value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")

@value.deleter
def value(self):
del self._value

# Примеры использования
obj = MyClass(10)
print(obj.value) # Вывод: 10

obj.value = 20
print(obj.value) # Вывод: 20

del obj.value
try:
print(obj.value) # Ошибка, так как атрибут удален
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '_value'


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
9
🤔 Что знаешь про ORM?

ORM (Object-Relational Mapping) — это технология, которая позволяет работать с реляционными базами данных через объектно-ориентированные модели. Она автоматически преобразует объекты в SQL-запросы и обратно, упрощая работу с данными. Популярные ORM включают Hibernate, SQLAlchemy и Django ORM.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥10
🤔 Как еще мы можем гарантировать закрытие файла, если не через with?

Использование оператора with является рекомендованным способом гарантированного закрытия файла, так как он автоматически управляет открытием и закрытием ресурса. Однако, если по какой-то причине вы не можете использовать with, можно гарантировать закрытие файла другими способами, такими как использование явного вызова метода close() в блоке finally.

🟠С использованием `try-finally`
Открытие и закрытие файла с использованием блока try-finally гарантирует, что файл будет закрыт, даже если в блоке try произойдет исключение. В этом примере файл открывается в блоке try, и его содержимое читается. Независимо от того, происходит ли исключение в блоке try или нет, блок finally будет выполнен, и файл будет закрыт.
file = None
try:
file = open('example.txt', 'r')
content = file.read()
print(content)
finally:
if file:
file.close()


🟠С использованием контекстного менеджера
Вы можете создать свой собственный контекстный менеджер, используя классы, который будет управлять открытием и закрытием файла. Это более сложный подход, но он полезен для понимания внутренних механизмов.
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()

# Примеры использования
file_manager = FileManager('example.txt', 'r')
try:
file = file_manager.__enter__()
content = file.read()
print(content)
finally:
file_manager.__exit__(None, None, None)


🟠С использованием декоратора
Еще один способ — использование декоратора для автоматического управления открытием и закрытием файла.
from functools import wraps

def open_file(filename, mode):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
file = open(filename, mode)
try:
result = func(file, *args, **kwargs)
finally:
file.close()
return result
return wrapper
return decorator

@open_file('example.txt', 'r')
def read_file(f):
return f.read()

# Примеры использования
print(read_file())


🟠С использованием менеджера контекста из `contextlib`
Модуль contextlib предоставляет полезные утилиты для создания контекстных менеджеров. Одной из таких утилит является contextlib.contextmanager, которая позволяет создавать контекстные менеджеры с помощью генераторов.
from contextlib import contextmanager

@contextmanager
def open_file(filename, mode):
file = open(filename, mode)
try:
yield file
finally:
file.close()

# Примеры использования
file_manager = open_file('example.txt', 'r')
file = file_manager.__enter__()
try:
content = file.read()
print(content)
finally:
file_manager.__exit__(None, None, None)


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

Singleton — это паттерн проектирования, который гарантирует создание только одного экземпляра класса. Его применяют для управления глобальными ресурсами, такими как настройки или подключение к базе данных. Однако он критикуется за сложность тестирования и возможные нарушения принципов SOLID.

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

Monkey patching (буквально "заплатка обезьяны") в программировании — это техника, позволяющая динамически изменять или расширять код во время выполнения программы. В Python это означает изменение или дополнение методов, атрибутов или классов в модуле или библиотеке, даже если у вас нет прямого доступа к исходному коду.

🚩Зачем нужен monkey patching

🟠Исправление ошибок
Быстрое исправление ошибок в сторонних библиотеках без необходимости изменения их исходного кода.
🟠Добавление функциональности
Расширение возможностей сторонних библиотек.
🟠Изменение поведения
Замена существующих функций или методов на свои собственные для изменения поведения программы.

🚩Пример monkey patching

import time

# Оригинальная функция
def original_sleep(seconds):
time.sleep(seconds)
print(f"Slept for {seconds} seconds")

# Monkey patching функции sleep
def patched_sleep(seconds):
print(f"Patched! Should have slept for {seconds} seconds")

# Применение monkey patching
time.sleep = patched_sleep

# Примеры использования
time.sleep(3) # Вывод: Patched! Should have slept for 3 seconds


🚩Недостатки

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

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

Сериализатор преобразует данные из одного формата в другой, например, из объектов в JSON или обратно. Он используется для передачи данных между системами, а также для хранения или передачи структурированных данных. В веб-разработке сериализаторы часто применяются для работы с API.

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

Это популярный фреймворк для тестирования на языке Python. Он используется для написания и выполнения тестов, чтобы гарантировать, что код работает правильно.

🚩Зачем нужен

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

🚩Как используется

🟠Написание тестов
Тесты пишутся в виде функций, начинающихся с test_.
🟠Запуск тестов
Тесты выполняются с помощью команды pytest в командной строке.
🟠Ассерты
Используются стандартные утверждения (assert) для проверки условий.

🚩Основные возможности

🟠Автоматическое обнаружение тестов
pytest автоматически находит тестовые функции, классы и файлы.
🟠Фикстуры: Позволяют определять подготовительный и завершающий код для тестов.
🟠Параметризация
Позволяет запускать один и тот же тест с различными входными данными.
🟠Плагины
Расширяют функциональность фреймворка, например, для генерации отчетов, интеграции с CI/CD системами.

🚩Пример теста с использованием

# test_sample.py
def test_addition():
assert 1 + 1 == 2

def test_subtraction():
assert 2 - 1 == 1


Запуск тестов:
pytest


🟠Фикстуры
Фикстуры позволяют подготовить необходимые данные или состояния для тестов.
import pytest

@pytest.fixture
def sample_data():
return {"key1": "value1", "key2": "value2"}

def test_sample_data(sample_data):
assert sample_data["key1"] == "value1"


🟠Параметризация тестов
Позволяет запускать один тест с разными наборами данных.
import pytest

@pytest.mark.parametrize("a, b, result", [
(1, 2, 3),
(2, 3, 5),
(3, 5, 8)
])
def test_addition(a, b, result):
assert a + b == result


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5