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

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Какие функции есть в модуле itertools?

Модуль предоставляет мощные итераторы:
- count, cycle, repeat — бесконечные генераторы.
- chain, zip_longest, product, permutations, combinations — для работы с последовательностями.
- groupby — группировка по ключу.
- islice, tee, filterfalse — фильтрация и дублирование.


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

В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования:

🟠Абстрактные модели
Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных.
Создается базовый класс с abstract = True в Meta.
Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы.
from django.db import models

class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Meta:
abstract = True # Указывает, что это абстрактная модель

class Post(BaseModel):
title = models.CharField(max_length=255)
content = models.TextField()

class Comment(BaseModel):
text = models.TextField()


🟠Многоуровневое (конкретное) наследование
Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса.
Django создаёт отдельные таблицы в БД для родительской и дочерней модели.
Дочерняя модель автоматически получает OneToOneField на родительскую.
class Person(models.Model):
name = models.CharField(max_length=255)

class Employee(Person): # Отдельная таблица employee
salary = models.DecimalField(max_digits=10, decimal_places=2)


🟠Прокси-модели (Proxy Models)
Используются, когда нужно изменить поведение модели без изменения структуры базы данных.
Прокси-модель наследует поля родительской модели.
В Meta указывается proxy = True.
Можно переопределять методы, добавлять новые, но не менять поля.
class Person(models.Model):
name = models.CharField(max_length=255)

class Manager(Person):
class Meta:
proxy = True # Указываем, что это прокси-модель

def get_uppercase_name(self):
return self.name.upper()


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Зачем нужен Docker Registry?

Docker Registry — это хранилище, где хранятся собранные образы. Оно позволяет:
- делиться образами между разработчиками и серверами;
- управлять версиями;
- автоматизировать развертывания.
Примеры: Docker Hub, GitLab Container Registry, Harbor.


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

C++ быстрее Python, потому что:
C++ — компилируемый язык, а Python — интерпретируемый.
C++ работает ближе к "железу", а Python использует абстракции.
C++ использует статическую типизацию, а Python динамическую (дополнительные проверки замедляют код).

🚩Разница в скорости выполнения

Простой пример: сложение чисел в цикле
Python (медленно)
import time

start = time.time()
s = 0
for i in range(10_000_000):
s += i
end = time.time()

print("Python:", end - start, "сек")


Результат
Python: 0.8 сек


C++ (быстро)
#include <iostream>
#include <chrono>

int main() {
auto start = std::chrono::high_resolution_clock::now();

long long s = 0;
for (int i = 0; i < 10000000; i++) {
s += i;
}

auto end = std::chrono::high_resolution_clock::now();
std::cout << "C++: "
<< std::chrono::duration<double>(end - start).count()
<< " сек" << std::endl;
}


Результат
C++: 0.05 сек


🚩3. Когда Python может быть быстрее?

🟠Если используются сторонние библиотеки (NumPy, Pandas, TensorFlow)
Они написаны на C/C++ и работают очень быстро. Пример: numpy.sum(arr) быстрее, чем sum(list), потому что работает на C.

🟠Разработка в Python быстрее (меньше кода, проще отладка)
Python код пишется в 2-5 раз быстрее, чем C++. Важно для стартапов и прототипов.

🟠Python лучше для обработки текста, веб-разработки, автоматизации
Например, парсинг HTML, обработка логов, работа с API.

🚩Когда C++ лучше?

🟠 Высокая производительность (игры, 3D, движки)
Игры, графика (Unreal Engine, Unity, CryEngine). Разработка операционных систем (Windows, Linux).

🟠Алгоритмы и математика (С++ быстрее Python в 10-100 раз)
Быстрая обработка данных, алгоритмы (sorting, graph, machine learning). Например, если нужно перемножить матрицы размером 10 000 × 10 000, C++ справится в разы быстрее.

🟠Работа с железом (Embedded, драйверы, робототехника)
Python слишком медленный для реального времени, а C++ используется в Arduino, автопилотах, микроконтроллерах.

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

Они определяют, насколько одна транзакция изолирована от других:
- Read Uncommitted — видны незакоммиченные данные (грязное чтение);
- Read Committed — видны только закоммиченные данные;
- Repeatable Read — данные не изменяются между чтениями;
- Serializable — максимальная изоляция, как при последовательном выполнении транзакций.


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

В Python можно создать класс двумя основными способами:
Через class (обычный способ)
Через type() (динамическое создание класса)

🚩Обычное создание класса через `class`

Это стандартный способ, который мы используем чаще всего.
class Person:
def __init__(self, name):
self.name = name

def say_hello(self):
return f"Привет, я {self.name}!"

p = Person("Алиса")
print(p.say_hello()) # Привет, я Алиса!


🚩Динамическое создание класса через `type()`

Функция type() позволяет создать класс "на лету".
Person = type("Person", (object,), {
"__init__": lambda self, name: setattr(self, "name", name),
"say_hello": lambda self: f"Привет, я {self.name}!"
})

p = Person("Боб")
print(p.say_hello()) # Привет, я Боб!


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

XML (Extensible Markup Language) — это язык разметки, предназначенный для хранения и передачи структурированных данных. Он читаем как человеком, так и машиной, используется для обмена данными между системами.


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

BaseView — это базовый класс представления (view) в Django, который предоставляет основу для создания представлений без жёсткой привязки к HTTP-методам (GET, POST и др.). Он является родительским классом для всех классов-представлений (CBV, Class-Based Views) в Django.

🚩Зачем нужен `BaseView`?

Обеспечивает общую структуру для классов-представлений.
Разделяет логику обработки запроса и рендеринг.
Позволяет переопределять логику обработки запросов через dispatch().
Является родительским классом для View, TemplateView, ListView и других CBV.

🚩Как работает `BaseView`?

Этот класс сам по себе не обрабатывает запросы. Он лишь задаёт каркас для представлений.
from django.views import View

class BaseView:
def dispatch(self, request, *args, **kwargs):
"""Определяет, какой метод (GET, POST и т. д.) вызывать"""
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
return handler(request, *args, **kwargs)

def http_method_not_allowed(self, request, *args, **kwargs):
"""Обработчик для неподдерживаемых HTTP-методов"""
return HttpResponseNotAllowed(self._allowed_methods())


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

Обычно мы используем View, который наследуется от BaseView.
from django.http import HttpResponse
from django.views import View

class MyView(View):
def get(self, request):
return HttpResponse("Это GET-запрос")

def post(self, request):
return HttpResponse("Это POST-запрос")


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

Функция wraps из модуля functools сохраняет оригинальное имя, документацию и сигнатуру оборачиваемой функции. Без неё у функции-декоратора теряется контекст.


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

Клиент-серверная архитектура – это модель взаимодействия устройств, где клиент запрашивает данные или услуги, а сервер их предоставляет.

🚩Как это работает?

Клиент – это программа или устройство, которое отправляет запросы (например, браузер).
Сервер – это программа или устройство, которое обрабатывает запросы и отправляет ответ (например, веб-сервер).

Сервер (сервер.py)
import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 8080)) # Привязываем сервер к адресу и порту
server.listen(1) # Ожидаем подключения одного клиента
print("Сервер запущен и ждёт подключения...")

conn, addr = server.accept() # Принимаем подключение
print(f"Подключен клиент: {addr}")

data = conn.recv(1024).decode() # Читаем данные от клиента
print(f"Клиент прислал: {data}")

conn.send("Привет от сервера!".encode()) # Отправляем ответ клиенту
conn.close()


Клиент (клиент.py)
import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("localhost", 8080)) # Подключаемся к серверу

client.send("Привет, сервер!".encode()) # Отправляем сообщение
response = client.recv(1024).decode() # Получаем ответ от сервера

print(f"Ответ сервера: {response}")
client.close()


🚩Как это работает?

1⃣Запускаем сервер.py. Он ждёт подключения.
2⃣Запускаем клиент.py. Клиент подключается к серверу и отправляет сообщение.
3⃣Сервер получает сообщение, отвечает клиенту и закрывает соединение.
4⃣Клиент принимает ответ и завершает работу.

🚩Типы клиент-серверных архитектур

Одноуровневая – клиент общается напрямую с сервером.
Двухуровневая – классическая схема "клиент сервер" (например, браузер веб-сервер).
Трёхуровневая – добавляется база данных (например, клиент сервер БД).
Многоуровневая – сложные распределённые системы с несколькими серверами (например, микросервисы).

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

1. Команда df -h показывает доступное и занятое место на всех дисках.
2. Использовать du -sh для анализа размера конкретной папки или файла.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6💊2
🤔 Что такое @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
🤔7💊3🔥1
🤔 Как происходит обращение к namedtuple?

К полям namedtuple можно обращаться по имени и по индексу


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

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

🟠Текстовые файлы (`TextIOWrapper`)
Это самый распространённый тип файловых объектов. Такие файлы используются для работы с текстовыми данными и поддерживают строковые операции.
   with open("example.txt", "w", encoding="utf-8") as file:
file.write("Привет, мир!") # Записываем текст в файл

with open("example.txt", "r", encoding="utf-8") as file:
content = file.read() # Читаем текст из файла
print(content)


🟠Бинарные файлы (`BufferedReader`, `BufferedWriter`)
Эти файлы используются для работы с двоичными данными (изображениями, видео, аудиофайлами и т. д.).
   with open("image.jpg", "rb") as file:
binary_data = file.read() # Читаем файл в бинарном режиме
print(binary_data[:10]) # Выведем первые 10 байтов

with open("copy.jpg", "wb") as file:
file.write(binary_data) # Записываем данные в новый файл


🟠Файлы ввода-вывода в памяти (`io.StringIO`, `io.BytesIO`)
Эти объекты представляют собой файловые буферы, которые хранят данные в оперативной памяти, а не на диске.
   from io import StringIO

file = StringIO()
file.write("Привет, мир!") # Запись данных в буфер
file.seek(0) # Перемещаем указатель в начало
print(file.read()) # Читаем данные из буфера


Пример работы с BytesIO:
   from io import BytesIO

file = BytesIO()
file.write(b"Binary data") # Запись бинарных данных
file.seek(0)
print(file.read()) # Чтение данных


🟠Файловые объекты на основе сокетов, пайпов и других источников
Python позволяет работать с файловыми объектами, полученными из нестандартных источников, например, сокетов или каналов связи (pipes).
   import socket

s = socket.socket()
s.connect(("example.com", 80))
s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
response = s.makefile("r", encoding="utf-8") # Создание файлового объекта
print(response.readline()) # Читаем первую строку HTTP-ответа
s.close()


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

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊15🔥5
🤔 Назовите основные мидлвари, зачем они нужны

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

🚩Основные мидлвари Django

🟠SecurityMiddleware
Добавляет важные HTTP-заголовки для защиты сайта:
- Strict-Transport-Security (HTTPS)
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY

🟠CommonMiddleware
Отвечает за:
Перенаправление с APPEND_SLASH=True (если /about → перенаправит на /about/).
Удаление www. (www.example.comexample.com).
Обработка кодировки и контента.

🟠SessionMiddleware
Позволяет Django хранить данные пользователя между запросами (например, авторизацию).
request.session["user_id"] = 42  # Сохраняем ID пользователя в сессии


🟠AuthenticationMiddleware
Позволяет работать с request.user, автоматически определяя пользователя.
if request.user.is_authenticated:
print(f"Пользователь: {request.user.username}")


🟠CSRF Middleware (CsrfViewMiddleware)
Защищает от атак межсайтовой подделки запросов (CSRF).
При обработке форм Django требует специальный CSRF-токен:
<form method="POST">
{% csrf_token %}
<input type="text" name="name">
</form>


🟠XFrameOptionsMiddleware
Запрещает встраивать сайт в <iframe>, предотвращая атаку Clickjacking.
X-Frame-Options: DENY


🟠MessageMiddleware
Позволяет передавать временные сообщения (django.contrib.messages).
from django.contrib import messages

messages.success(request, "Вы успешно вошли!")
messages.error(request, "Ошибка авторизации!")


🚩Как добавить или отключить мидлвари?

Мидлвари хранятся в settings.py:
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
]


🚩Как написать свой мидлвар?

Допустим, хотим логировать все запросы.
Создаём middleware.py
import datetime

class LogMiddleware:
def __init__(self, get_response):
self.get_response = get_response

def __call__(self, request):
print(f"[{datetime.datetime.now()}] Запрос: {request.path}")
response = self.get_response(request)
return response


Добавляем в settings.py
MIDDLEWARE.append("myapp.middleware.LogMiddleware")


Теперь в консоли будем видеть все запросы!
[2024-02-28 12:00:00] Запрос: /
[2024-02-28 12:01:00] Запрос: /login/


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

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


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

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

🟠Как работает процесс аутентификации?
Аутентификация в Django основана на модели пользователя (User) и механизме сессий. Когда пользователь входит в систему, Django проверяет его учетные данные и создает сессию, сохраняя в ней идентификатор пользователя.
Процесс можно разделить на несколько шагов:
Пользователь вводит логин и пароль.
Django проверяет данные через аутентификационный бэкенд.
Если данные верны, Django создает сессию.
При каждом запросе Django проверяет, авторизован ли пользователь.

🚩Основные компоненты системы аутентификации

🟠Модель пользователя (`User`)
Django предоставляет встроенную модель пользователя django.contrib.auth.models.User. Она содержит:
username, email, password
is_staff, is_superuser, is_active
date_joined, last_login
from django.contrib.auth.models import User

# Создание пользователя
user = User.objects.create_user(username="admin", password="12345")
user.email = "admin@example.com"
user.save()

# Проверка пароля
print(user.check_password("12345")) # True


🟠Аутентификация (`authenticate`)
Django использует функцию authenticate() для проверки учетных данных.
from django.contrib.auth import authenticate

user = authenticate(username="admin", password="12345")
if user is not None:
print("Успешный вход!")
else:
print("Ошибка аутентификации!")


🟠Вход и выход (`login` / `logout`)
После успешной аутентификации пользователя можно "впустить" с помощью login().
from django.contrib.auth import login, logout

def user_login(request):
user = authenticate(username="admin", password="12345")
if user:
login(request, user) # Создает сессию
return "Пользователь вошел!"
return "Ошибка входа"

def user_logout(request):
logout(request) # Удаляет сессию
return "Пользователь вышел!"


🟠Проверка аутентификации
Во вьюхах можно проверить, авторизован ли пользователь
if request.user.is_authenticated:
print("Пользователь залогинен:", request.user.username)
else:
print("Гость")


Для защиты маршрутов можно использовать декоратор @login_required:
from django.contrib.auth.decorators import login_required

@login_required
def profile(request):
return "Это страница профиля!"


🚩Настройка аутентификации

🟠Настройки в `settings.py`
Django по умолчанию использует django.contrib.auth.backends.ModelBackend для аутентификации через базу данных. Можно добавить кастомные бэкенды:
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend', # Обычная аутентификация
]


🟠Изменение модели пользователя
Если стандартной модели User недостаточно, можно создать кастомную модель
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, unique=True)

# В settings.py указываем свою модель
AUTH_USER_MODEL = "myapp.CustomUser"


🟠Разрешения и группы
Django поддерживает группы пользователей и права доступа.
if user.has_perm("app_name.permission_codename"):
print("У пользователя есть разрешение!")


Использование групп
from django.contrib.auth.models import Group

group = Group.objects.create(name="Editors") # Создаем группу
user.groups.add(group) # Добавляем пользователя в группу


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Какая связь хеш-функцией и изменяемостью/неизменяемостью?

Хеш-функция (hash()) возвращает числовое значение, которое используется в структурах данных вроде словарей и множеств. Чтобы объект можно было хешировать, он должен быть неизменяемым, так как хеш-значение должно оставаться постоянным. Изменяемые объекты, такие как списки и словари, не могут быть ключами в словаре, так как их содержимое может измениться, и это нарушит хеш-таблицу.

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

Пакет (package) в Python — это набор модулей, объединённых в одну директорию. Главное отличие от обычной папки — наличие файла __init__.py, который делает директорию пакетом.

🚩Как создать пакет?

Допустим, мы хотим создать пакет math_utils с модулями для работы с числами.
/my_project
/math_utils ← Это пакет
__init__.py ← Делаем директорию пакетом
arithmetic.py ← Модуль с функциями сложения/вычитания
geometry.py ← Модуль с функциями для работы с фигурами
main.py ← Основной файл программы


Код в arithmetic.py
def add(a, b):
return a + b

def subtract(a, b):
return a - b


Код в geometry.py
def square_area(side):
return side * side


Код в __init__.py
from .arithmetic import add, subtract
from .geometry import square_area


Теперь можно импортировать функции прямо из пакета:
from math_utils import add, square_area

print(add(2, 3)) # 5
print(square_area(4)) # 16


🚩Импорт модулей из пакета

Импортируем весь пакет (с __init__.py)
from math_utils import add, square_area


Импортируем конкретный модуль
from math_utils import arithmetic
print(arithmetic.add(3, 5))


Импортируем конкретную функцию из модуля
from math_utils.arithmetic import add
print(add(3, 5))


🚩Как работают пакеты в Python?

Python ищет пакеты по sys.path
import sys
print(sys.path) # Пути, где Python ищет модули


Если Python не находит пакет, можно добавить путь вручную:
import sys
sys.path.append("/path/to/my_project")


Можно создавать вложенные пакеты
/my_project
/math_utils
__init__.py
/advanced
__init__.py
calculus.py


Импорт:
from math_utils.advanced.calculus import derivative


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