Python | Вопросы собесов
13.8K subscribers
34 photos
1 video
1 file
939 links
Download Telegram
🤔 Зачем нужны схемы в БД?

Схема (schema) в базе данных — это логическая группировка объектов (таблиц, индексов, представлений и т. д.) внутри одной БД.

🚩Что такое схема в БД?

Схема — это контейнер для объектов БД (таблиц, индексов, процедур).
База данных (company_db)
├── Схема: public (по умолчанию)
│ ├── Таблица: employees
│ ├── Таблица: departments
├── Схема: hr
│ ├── Таблица: employees
│ ├── Таблица: salaries
├── Схема: sales
│ ├── Таблица: customers
│ ├── Таблица: orders


🚩Как создавать и использовать схемы?

Создание схемы (CREATE SCHEMA)
CREATE SCHEMA hr;  -- Создаём схему "hr"


Создание таблицы внутри схемы
CREATE TABLE hr.employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
position VARCHAR(50)
);


Выбор схемы по умолчанию
SET search_path TO hr;


🚩Где полезны схемы?

🟠Разделение данных по модулям
Если в БД хранятся разные области бизнеса (кадры, продажи, финансы), их можно разделить по схемам:
- hr.employees, hr.salaries
- sales.orders, sales.customers

🟠Разные версии одной БД
Например, в PostgreSQL можно создать схему dev для тестов:
- dev.users — тестовая версия таблицы
- prod.users — продакшен-версия

🟠Безопасность и доступ пользователей
Можно дать доступ к разным схемам разным пользователям:
GRANT USAGE ON SCHEMA hr TO hr_manager;
GRANT SELECT ON ALL TABLES IN SCHEMA hr TO hr_manager;


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

Индексы в PostgreSQL — это структуры данных (обычно B-tree), которые ускоряют выполнение запросов.
Бывают:
- B-tree — по умолчанию, для большинства операций;
- GIN — для полнотекстового поиска, массивов;
- GIST — для геоданных;
- BRIN — для больших, упорядоченных таблиц;
- Hash — редко используется, специфичный.
Они автоматически обновляются при изменении таблицы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9💊1
🤔 Для чего нужны библиотеки sqlparse, asgiref в Django?

Django использует sqlparse и asgiref как вспомогательные библиотеки для работы с SQL и асинхронностью. Разберём их назначение подробно.

🟠`sqlparse` – разбор SQL-запросов
sqlparse (SQL Parser) — это библиотека для анализа, форматирования и обработки SQL-запросов. В Django она используется в админке, логах и отладке ORM.

🚩Где используется в Django?

Форматирование SQL-запросов в django.db.connection.queries
   from django.db import connection
from sqlparse import format

queries = connection.queries # Получаем список SQL-запросов
for q in queries:
print(format(q["sql"], reindent=True, keyword_case="upper")) # Красивый SQL


Логирование SQL-запросов
sqlparse помогает Django красиво выводить SQL-запросы в DEBUG=True.

Команда sqlmigrate
   python manage.py sqlmigrate app_name 0001


🟠`asgiref` – асинхронность в Django
asgiref (Asynchronous Server Gateway Interface Reference) — это библиотека, которая помогает Django работать в асинхронном (async) режиме. Django поддерживает ASGI с версии 3.0, и asgiref — это её обязательная зависимость.

🚩Где используется в Django?

🟠Поддержка ASGI
Django с версии 3.0 поддерживает асинхронные вьюхи, WebSockets и асинхронные базы данных (например, с asyncpg).
В settings.py есть параметр:
     ASGI_APPLICATION = "myproject.asgi.application"


🟠Асинхронные middleware
Django 4.x поддерживает асинхронные middleware через asgiref.sync и asgiref.local.

🟠Преобразование `async` → `sync` и наоборот
Django использует sync_to_async() и async_to_sync() из asgiref:
     from asgiref.sync import sync_to_async

def sync_function():
return "Hello from sync!"

async_function = sync_to_async(sync_function)
print(async_function()) # Вызывает синхронную функцию в асинхронном коде


🟠Локальное хранилище для асинхронных задач (`asgiref.local.Local`)
Позволяет хранить данные отдельно для каждого потока или запроса.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Примеры использования функции zip?

Функция zip объединяет несколько итерируемых объектов в кортежи, идущие параллельно. Это удобно, когда нужно обрабатывать пары элементов — например, имена и их оценки, ключи и значения, столбцы из разных таблиц.


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

Monkey Patching — это изменение или замена кода существующих классов и функций во время выполнения программы. Хотя этот метод бывает полезен, особенно в тестировании, его использование в продакшене может привести к опасным и непредсказуемым последствиям

🚩Ломает предсказуемость кода

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

# Меняем поведение метода now()
def fake_now():
return datetime.datetime(2000, 1, 1)

datetime.datetime.now = fake_now # Monkey Patch

print(datetime.datetime.now()) # Выведет 2000-01-01 00:00:00


🚩Может вызвать неожиданные ошибки после обновления библиотек

Если библиотека обновится, и её внутренняя логика изменится, Monkey Patch может перестать работать или, что ещё хуже, привести к багам.
Ты сделал Monkey Patch метода json.dumps, а потом библиотека json обновилась и поменяла его сигнатуру. Теперь твой патч сломается или будет работать некорректно.

🚩Трудно отлаживать и поддерживать

Monkey Patching меняет поведение кода в скрытом режиме, поэтому сложно понять, почему что-то работает не так. Если баг возник из-за патча, отладка может занять часы или даже дни.
Ты исправил баг с str.split(), заменив его через Monkey Patch, но через 6 месяцев разработчик обновил код, забыл про патч, и всё сломалось.

🚩Может затронуть весь код проекта (глобальное изменение)

Monkey Patching меняет поведение для всей программы, а не только в одном модуле или файле. Это делает код хрупким и непредсказуемым.
Если ты изменишь метод dict.get(), он будет вести себя по-другому во всех модулях программы. Это может привести к критическим ошибкам.
original_get = dict.get

def patched_get(self, key, default=None):
print(f"Запрашивается ключ: {key}")
return original_get(self, key, default)

dict.get = patched_get # Monkey Patch

d = {"a": 10}
print(d.get("a")) # Работает, но теперь с побочным эффектом


🚩Нет гарантии, что это сработает во всех окружениях
Monkey Patch может работать на одной версии Python или библиотеки, но сломаться на другой. В продакшене, где есть разные серверы и окружения, это может вызвать непредсказуемые ошибки.

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

Это текстовый формат обмена данными:
- Представляет объекты и массивы в виде пар "ключ-значение".
- Легко читается человеком и машиной.
- Независим от языка, но тесно связан с синтаксисом JavaScript.
- Используется повсеместно для API и веб-приложений.
Примеры типов: строки, числа, булевы, массивы, объекты, null.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
🤔 Cловари {dict}?

Словарь (dict) — это структура данных, которая хранит пары "ключ → значение".

🟠Создание словаря
Через {} (фигурные скобки)
my_dict = {"name": "Alice", "age": 25, "city": "New York"}


Изменение значения
my_dict["age"] = 26  # Меняем возраст


del — удаление по ключу
del my_dict["city"]


Перебор ключей (for key in dict)
for key in my_dict:
print(key, my_dict[key])


Проверка наличия ключа
if "name" in my_dict:
print("Ключ существует!")


🟠Генерация словарей (Dictionary Comprehension)
Создадим словарь квадратов чисел
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}


🟠Ключи должны быть хешируемыми (неизменяемыми)
Нельзя использовать list как ключ!
my_dict[[1, 2, 3]] = "Ошибка"  # TypeError: unhashable type: 'list'


Можно использовать tuple, int, str, frozenset
my_dict[(1, 2, 3)] = "OK"


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 L - Liskov Substitution Principle - принцип подстановки Барбары Лисков

Любой объект подкласса должен быть заменяем на объект суперкласса без нарушения функциональности. Это поддерживает корректность и предсказуемость поведения кода.

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

В SQL можно объединять данные из двух таблиц без использования JOIN, используя альтернативные методы.

🚩Использование подзапросов (`SELECT` внутри `SELECT`)

Подзапрос (subquery) позволяет выбрать данные из одной таблицы, используя данные из другой.
Допустим, у нас есть две таблицы:
employees (id, name, department_id)
departments (id, name)
SELECT name, 
(SELECT name FROM departments WHERE id = employees.department_id) AS department_name
FROM employees;


🚩Использование `IN` или `EXISTS`

Можно фильтровать данные из одной таблицы, проверяя наличие значений в другой.
SELECT name 
FROM employees
WHERE department_id IN (SELECT id FROM departments);


🚩Объединение данных через `UNION`
Если таблицы имеют схожие колонки, можно объединить их с UNION.
SELECT id, name, email FROM users_old
UNION
SELECT id, name, email FROM users_new;


🚩Использование `CROSS JOIN` через `WHERE`

Хотя CROSS JOIN делает декартово произведение, его можно фильтровать WHERE, имитируя INNER JOIN.
SELECT e.name, d.name AS department
FROM employees e, departments d
WHERE e.department_id = d.id;


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

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


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

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

🚩Зачем нужен паттерн Заместитель

🟠Управление доступом
Когда необходимо контролировать доступ к ресурсу.
🟠Отложенная инициализация
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
🟠Управление ресурсами
Для управления ресурсами, такими как память или сетевые соединения.
🟠Логирование и кэширование
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.

🚩Типы заместителей

🟠Управляющий заместитель (Virtual Proxy):
Контролирует доступ к объекту, создавая его по требованию.
🟠Защитный заместитель (Protection Proxy):
Контролирует доступ к объекту, ограничивая права пользователей.
🟠Удалённый заместитель (Remote Proxy)
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
🟠Кэш-прокси (Cache Proxy)
Кэширует результаты запросов к объекту для повышения производительности.

🚩Как используется паттерн Заместитель

Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс Proxy контролирует доступ к классу RealSubject, добавляя проверку доступа и логирование.
from abc import ABC, abstractmethod

class Subject(ABC):
@abstractmethod
def request(self):
pass

class RealSubject(Subject):
def request(self):
print("Реальный объект: Обработка запроса.")

class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject

def request(self):
if self.check_access():
self._real_subject.request()
self.log_access()

def check_access(self):
print("Заместитель: Проверка доступа перед выполнением запроса.")
return True

def log_access(self):
print("Заместитель: Логирование времени запроса.")

# Клиентский код
real_subject = RealSubject()
proxy = Proxy(real_subject)

proxy.request()


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

- Через SQL-запросы напрямую (CLI, pgAdmin, MySQL Workbench);
- Через ORM (Django ORM, SQLAlchemy, Hibernate);
- Через Query Builder;
- Через API (REST, GraphQL, если БД скрыта за сервером);
- С использованием GUI-инструментов для админов.


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

Когда сервер получает HTTP-запрос типа GET, он выполняет следующие действия

🟠Анализ запроса
проверяет URL и параметры в строке запроса (например, ?id=123).
🟠Поиск ресурса
находит запрашиваемый файл, данные из базы или другой ресурс.
🟠Возврат ответа
отправляет данные клиенту (если ресурс найден — код 200, если нет — 404).

🚩Особенности GET-запроса

🟠Безопасный
не изменяет данные на сервере, используется только для чтения.
🟠Идемпотентный
повторные запросы дают одинаковый результат.
🟠Параметры в URL
данные передаются через строку запроса, что не подходит для конфиденциальной информации.

import requests

response = requests.get("https://api.example.com/data", params={"id": 123})
print(response.text) # Данные с сервера


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В каких случаях использовать встроенные коллекции (list, tuple, set)?

Списки (list) применяются, когда нужен изменяемый порядок элементов. Кортежи (tuple) подходят для фиксированных наборов данных, а множества (set) — для уникальных, неупорядоченных элементов с быстрым поиском.


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

В Python практически всё является объектом: числа, строки, функции, классы, модули и даже сам интерпретатор Python рассматривает их как объекты. Однако есть несколько вещей, которые объектами не являются:

🟠Операторы и синтаксические конструкции
Операторы (+, -, *, and, or, not и т. д.) сами по себе не являются объектами. Они — часть синтаксиса языка и не имеют представления в виде объектов в памяти.
   a = 10 + 5  # Оператор "+" выполняет сложение, но сам по себе не объект
print(type(+)) # Ошибка: нельзя получить тип оператора


🟠Ключевые слова (keywords)
Встроенные ключевые слова Python (if, else, while, for, def, class, return и т. д.) не являются объектами. Они зарезервированы интерпретатором и используются для управления потоком выполнения кода.
   print(type(if))  # Ошибка: ключевое слово не является объектом


🟠Идентификаторы переменных
Хотя переменные ссылаются на объекты, сами идентификаторы (имена переменных) — это просто ссылки, а не объекты.
   x = 42  # x — это имя, а не объект
print(type(x)) # Это целое число, но само имя "x" объектом не является


🟠Аннотации типов во время компиляции
Аннотации типов в Python, такие как list[str], не создают объекты во время компиляции кода. Они интерпретируются только на уровне анализа типов.
   def func(x: int) -> str:
return str(x)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Опишите функцию filter из модуля functools

На самом деле filter — встроенная функция, а не из functools. Она фильтрует элементы последовательности по заданному условию. Возвращает итератор только тех значений, для которых функция-условие возвращает истину.


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

Для сортировки списка словарей по определенному полю в 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
👍4
🤔 Байтовые массивы (byte array)?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2💊1
🤔 Почему вычислять большие значения в асинхронной функции плохо?

Асинхронность (asyncio) в Python не выполняет код параллельно, а переключается между задачами во время ожидания (I/O-bound).
Если в async-функции делать тяжёлые вычисления (CPU-bound), это блокирует asyncio, потому что в Python есть GIL (Global Interpreter Lock).

🚩Асинхронность в Python подходит для ввода-вывода (I/O-bound)

Асинхронность позволяет выполнять задачи без блокировки, но только если они ждут чего-то (файлы, сеть, БД).
import asyncio
import aiohttp

async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()

async def main():
urls = ["https://example.com"] * 5
results = await asyncio.gather(*(fetch(url) for url in urls))

asyncio.run(main())


🚩Проблема с `async` и тяжёлыми вычислениями (CPU-bound)

Если в async-функции делать тяжёлые вычисления, Python не сможет переключаться между задачами.
import asyncio

async def heavy_task(n):
print(f"Вычисляю {n}...")
total = sum(i**2 for i in range(n)) # Долгий процесс
return total

async def main():
await asyncio.gather(heavy_task(10**7), heavy_task(10**7))

asyncio.run(main())


🚩Как правильно выполнять вычисления в `async`?

🟠Использовать `asyncio.to_thread()` (делегирование в потоки)
В Python 3.9+ можно выполнять CPU-задачи в отдельных потоках, не блокируя asyncio.
import asyncio

def heavy_computation(n):
return sum(i**2 for i in range(n))

async def main():
result = await asyncio.to_thread(heavy_computation, 10**7)
print(result)

asyncio.run(main())


🟠Использовать `multiprocessing` (запуск на нескольких ядрах)
Так как Python использует GIL, единственный способ выполнять настоящий параллелизм — это multiprocessing.
import asyncio
import multiprocessing

def heavy_computation(n):
return sum(i**2 for i in range(n))

async def main():
loop = asyncio.get_running_loop()
with multiprocessing.Pool() as pool:
result = await loop.run_in_executor(pool, heavy_computation, 10**7)
print(result)

asyncio.run(main())


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4
🤔 Какие основные функции Python есть?

Встроенные функции Python включают такие базовые инструменты, как len, type, print, input, int, str, list, dict, sum, max, min, zip, enumerate, range, map, filter и многие другие. Они обеспечивают широкий функционал без необходимости импортировать внешние библиотеки.


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

Это декоратор, предоставленный модулем dataclasses, который автоматически генерирует специальные методы, такие как __init__,🤔 Что так🤔 Что т и другие, для вашего класса. Это упрощает создание классов, предназначенных для хранения данных, устраняя необходимость писать много шаблонного кода.

🚩Зачем нужен

🟠Упрощение кода
Автоматически генерирует методы, сокращая шаблонный код.
🟠Читабельность
Делает код более чистым и легким для понимания.
🟠Удобство
Обеспечивает удобные и мощные возможности для работы с данными.

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

Нужно импортировать его из модуля 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__,🤔 Что так🤔 Что такМогут быть сгенерированы для сравнения объектов (если указано).

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

Вы можете настроить поведение @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() для настройки отдельных полей, например, для указания значений по умолчанию или исключения полей из методов
5)

print(

🤔 Что т и других.
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
👍9💊5🤔4