🤔 Какие бывают виды тестов?
Существует несколько видов тестов, каждый из которых имеет свою цель и особенности.
🚩Виды
🟠Юнит-тесты (Unit Tests)
Проверка работы отдельных модулей или функций в изоляции от других частей системы.
Ориентированы на минимальные части кода (функции, методы, классы).
Высокая скорость выполнения.
Простота написания и отладки.
Обычно пишутся разработчиками.
🟠Интеграционные тесты (Integration Tests)
Проверка взаимодействия между различными модулями или компонентами системы.
Тестируют комбинации модулей и их взаимодействие.
Более сложные и медленные по сравнению с юнит-тестами.
Могут выявить проблемы в интерфейсах между модулями.
🟠Системные тесты (System Tests)
Проверка всей системы целиком на соответствие требованиям.
Тестируют систему в рабочей среде.
Включают проверку всех функциональных и нефункциональных требований.
Могут включать пользовательские сценарии.
Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API.
🟠Приемочные тесты (Acceptance Tests)
Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя.
Часто выполняются вместе с заказчиком или пользователем.
Фокусируются на бизнес-требованиях и пользовательских сценариях.
Успешное прохождение приемочных тестов является критерием готовности системы к выпуску.
Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям.
🟠Регрессионные тесты (Regression Tests)
Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале.
Выполняются после внесения изменений в код.
Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов.
Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода.
🟠Нефункциональные тесты (Non-functional Tests)
Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др.
🚩Основные виды:
🟠Тесты производительности
Измеряют скорость выполнения, пропускную способность и время отклика системы.
🟠Тесты безопасности
Оценивают защищенность системы от угроз и атак.
🟠Тесты удобства использования
Проверяют удобство и интуитивность пользовательского интерфейса.
Ставь 👍 и забирай 📚 Базу знаний
Существует несколько видов тестов, каждый из которых имеет свою цель и особенности.
🚩Виды
🟠Юнит-тесты (Unit Tests)
Проверка работы отдельных модулей или функций в изоляции от других частей системы.
Ориентированы на минимальные части кода (функции, методы, классы).
Высокая скорость выполнения.
Простота написания и отладки.
Обычно пишутся разработчиками.
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
🟠Интеграционные тесты (Integration Tests)
Проверка взаимодействия между различными модулями или компонентами системы.
Тестируют комбинации модулей и их взаимодействие.
Более сложные и медленные по сравнению с юнит-тестами.
Могут выявить проблемы в интерфейсах между модулями.
def fetch_data_from_api():
response = requests.get('https://api.example.com/data')
return response.json()
def test_fetch_data_from_api():
data = fetch_data_from_api()
assert 'key' in data
🟠Системные тесты (System Tests)
Проверка всей системы целиком на соответствие требованиям.
Тестируют систему в рабочей среде.
Включают проверку всех функциональных и нефункциональных требований.
Могут включать пользовательские сценарии.
Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API.
🟠Приемочные тесты (Acceptance Tests)
Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя.
Часто выполняются вместе с заказчиком или пользователем.
Фокусируются на бизнес-требованиях и пользовательских сценариях.
Успешное прохождение приемочных тестов является критерием готовности системы к выпуску.
Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям.
🟠Регрессионные тесты (Regression Tests)
Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале.
Выполняются после внесения изменений в код.
Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов.
Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода.
🟠Нефункциональные тесты (Non-functional Tests)
Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др.
🚩Основные виды:
🟠Тесты производительности
Измеряют скорость выполнения, пропускную способность и время отклика системы.
🟠Тесты безопасности
Оценивают защищенность системы от угроз и атак.
🟠Тесты удобства использования
Проверяют удобство и интуитивность пользовательского интерфейса.
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Когда выполняется файл __init__.py?
Этот файл выполняется при первом импорте модуля или пакета, в котором он находится. Он может содержать код инициализации или указывать, какие модули нужно экспортировать при импорте пакета. В современных версиях Python он не обязателен, но по-прежнему широко используется.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Этот файл выполняется при первом импорте модуля или пакета, в котором он находится. Он может содержать код инициализации или указывать, какие модули нужно экспортировать при импорте пакета. В современных версиях Python он не обязателен, но по-прежнему широко используется.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое type?
В Python
Определяет тип объекта (
Создаёт новые классы динамически (
🟠1. `type(obj)`: Определение типа объекта
Функция
🟠`type(name, bases, attrs)`: Создание класса динамически
Функция
🟠`type` как метакласс
В Python
Ставь 👍 и забирай 📚 Базу знаний
В Python
type — это встроенная функция и метакласс, который: Определяет тип объекта (
type(obj)). Создаёт новые классы динамически (
type(name, bases, attrs)). 🟠1. `type(obj)`: Определение типа объекта
Функция
type(obj) возвращает класс (тип) объекта.print(type(42)) # <class 'int'>
print(type("hello")) # <class 'str'>
print(type([1, 2, 3])) # <class 'list'>
if type(42) is int:
print("Это целое число!")
🟠`type(name, bases, attrs)`: Создание класса динамически
Функция
type может создавать новые классы "на лету".MyClass = type("MyClass", (object,), {"x": 10, "hello": lambda self: "Hello!"})
obj = MyClass()
print(obj.x) # 10
print(obj.hello()) # Hello!🟠`type` как метакласс
В Python
type — это метакласс для всех классов, то есть классы тоже являются объектами type.class A:
pass
print(type(A)) # <class 'type'>
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Где лучше хранить хеш запроса — в Redis или PostgreSQL?
- Redis — лучше для временного хранения, кэширования, частого доступа;
- PostgreSQL — если хеш должен быть постоянным, использоваться в связях и аналитике.
Если нужны быстродействие и частые запросы — Redis. Если нужна надёжность и история — PostgreSQL.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Redis — лучше для временного хранения, кэширования, частого доступа;
- PostgreSQL — если хеш должен быть постоянным, использоваться в связях и аналитике.
Если нужны быстродействие и частые запросы — Redis. Если нужна надёжность и история — PostgreSQL.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥1
🤔 Что такое Host?
Host (хост) — это устройство или сервер, подключённый к сети, который может предоставлять или запрашивать данные.
🚩Где используется `Host`?
🟠В HTTP-запросах (заголовок `Host`)
Когда браузер запрашивает сайт, он отправляет заголовок
🟠В настройке DNS и доменных имён
Host — это доменное имя, привязанное к IP-адресу.
-
-
🟠3. В локальной сети (локальные хосты)
Внутри сети устройства тоже считаются хостами (
Ставь 👍 и забирай 📚 Базу знаний
Host (хост) — это устройство или сервер, подключённый к сети, который может предоставлять или запрашивать данные.
GET /index.html HTTP/1.1
Host: example.com
🚩Где используется `Host`?
🟠В HTTP-запросах (заголовок `Host`)
Когда браузер запрашивает сайт, он отправляет заголовок
Host, чтобы сервер знал, какой сайт нужно отдать. GET / HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0
🟠В настройке DNS и доменных имён
Host — это доменное имя, привязанное к IP-адресу.
-
example.com → 192.168.1.100 -
mail.example.com → 192.168.1.101 127.0.0.1 mysite.local
🟠3. В локальной сети (локальные хосты)
Внутри сети устройства тоже считаются хостами (
192.168.1.10, 192.168.1.20). localhost (127.0.0.1) — это всегда локальный компьютер.Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Чем отличается асинхронный контекстный менеджер от синхронного?
Асинхронный контекстный менеджер (async with) работает с асинхронными ресурсами: подключениями, файлами и т.д. Он должен реализовывать методы aenter и aexit. В отличие от синхронного (with), он не блокирует event loop и позволяет выполнять I/O без задержек.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Асинхронный контекстный менеджер (async with) работает с асинхронными ресурсами: подключениями, файлами и т.д. Он должен реализовывать методы aenter и aexit. В отличие от синхронного (with), он не блокирует event loop и позволяет выполнять I/O без задержек.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 В чем отличия pytz от datetime?
🟠`datetime` – встроенный модуль Python
Модуль
🟠`pytz` – внешний модуль для работы с часовыми поясами
Библиотека
🚩Как работать с часовыми поясами правильно?
Создание
Конвертация времени между часовыми поясами
Использование UTC (лучший подход для серверов)
Ставь 👍 и забирай 📚 Базу знаний
🟠`datetime` – встроенный модуль Python
Модуль
datetime позволяет работать с датами и временем, но по умолчанию он не поддерживает часовые пояса.from datetime import datetime
dt = datetime.now() # Получаем текущую дату и время
print(dt) # Например: 2024-02-28 14:30:00.123456
print(dt.tzinfo) # None (нет информации о часовом поясе)
🟠`pytz` – внешний модуль для работы с часовыми поясами
Библиотека
pytz добавляет поддержку часовых поясов и позволяет работать с разными временными зонами. from datetime import datetime
import pytz
tz = pytz.timezone("Europe/Moscow") # Часовой пояс Москвы
dt = datetime.now(tz) # Получаем текущее время с учетом часового пояса
print(dt) # Например: 2024-02-28 17:30:00+03:00
print(dt.tzinfo) # Europe/Moscow
🚩Как работать с часовыми поясами правильно?
Создание
datetime с часовым поясом pytz dt = datetime(2024, 2, 28, 15, 0) # Наивная дата
tz = pytz.timezone("Europe/Moscow")
dt = tz.localize(dt) # Присваиваем часовой пояс
print(dt) # 2024-02-28 15:00:00+03:00
Конвертация времени между часовыми поясами
ny_tz = pytz.timezone("America/New_York")
ny_time = dt.astimezone(ny_tz)
print(ny_time) # Конвертированное время в Нью-ЙоркеИспользование UTC (лучший подход для серверов)
utc_now = datetime.now(pytz.UTC) # Текущее время в UTC
print(utc_now) # Например: 2024-02-28 14:30:00+00:00
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 В чем суть принципа REST?
REST (Representational State Transfer) — это архитектурный стиль для разработки веб-сервисов, который использует стандартные методы HTTP для взаимодействия между клиентом и сервером. В REST каждая операция выполняется с использованием определённого HTTP-метода: GET для получения данных, POST для создания, PUT для обновления и DELETE для удаления. RESTful API использует унифицированные ресурсы и URL для представления данных, а также статeless-коммуникацию между клиентом и сервером. Основной принцип REST — это простота и масштабируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
REST (Representational State Transfer) — это архитектурный стиль для разработки веб-сервисов, который использует стандартные методы HTTP для взаимодействия между клиентом и сервером. В REST каждая операция выполняется с использованием определённого HTTP-метода: GET для получения данных, POST для создания, PUT для обновления и DELETE для удаления. RESTful API использует унифицированные ресурсы и URL для представления данных, а также статeless-коммуникацию между клиентом и сервером. Основной принцип REST — это простота и масштабируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4🔥1💊1
🤔 Какая сложность сортировки слияния в худшем случае?
Сортировка слиянием (
В худшем случае сложность O(n log n).
🚩Как работает сортировка слиянием?
🟠Делим массив пополам
до тех пор, пока не останутся отдельные элементы.
🟠Сортируем и сливаем
полученные подмассивы.
Ставь 👍 и забирай 📚 Базу знаний
Сортировка слиянием (
Merge Sort) — это алгоритм, который использует разделяй и властвуй (divide & conquer). В худшем случае сложность O(n log n).
🚩Как работает сортировка слиянием?
🟠Делим массив пополам
до тех пор, пока не останутся отдельные элементы.
🟠Сортируем и сливаем
полученные подмассивы.
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
sorted_arr = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
sorted_arr.append(left[i])
i += 1
else:
sorted_arr.append(right[j])
j += 1
sorted_arr.extend(left[i:])
sorted_arr.extend(right[j:])
return sorted_arr
arr = [5, 2, 9, 1, 5, 6]
print(merge_sort(arr))
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Для чего нужен модуль warnings?
Он управляет системой предупреждений: позволяет их создавать, фильтровать, подавлять и логировать. Это удобно для устаревших функций или плохих практик.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Он управляет системой предупреждений: позволяет их создавать, фильтровать, подавлять и логировать. Это удобно для устаревших функций или плохих практик.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Как в Python происходит поиск переменной по области видимости?
В Python поиск переменной происходит по правилу LEGB, которое определяет порядок поиска в четырёх областях видимости:
Пример работы LEGB
Вывод
🚩Глобальные переменные (`global`)
Если нужно изменить глобальную переменную внутри функции, используем
🚩Переменные из внешней функции (`nonlocal`)
Если в вложенной функции нужно изменить переменную из enclosing-области, используем
🚩Что если переменная отсутствует во всех областях?
Если переменная не найдена в LEGB, Python выдаст
Ошибка
🚩`Built-in` — встроенные функции
Python в последнюю очереде проверяет встроенные функции (
Ставь 👍 и забирай 📚 Базу знаний
В Python поиск переменной происходит по правилу LEGB, которое определяет порядок поиска в четырёх областях видимости:
Пример работы LEGB
x = "глобальная" # Global
def outer():
x = "охватывающая" # Enclosing
def inner():
x = "локальная" # Local
print(x) # Поиск начинается отсюда (L)
inner()
outer()
Вывод
локальная
🚩Глобальные переменные (`global`)
Если нужно изменить глобальную переменную внутри функции, используем
globalx = 10 # Глобальная переменная
def modify_global():
global x
x = 20 # Меняем глобальную переменную
modify_global()
print(x) # 20
🚩Переменные из внешней функции (`nonlocal`)
Если в вложенной функции нужно изменить переменную из enclosing-области, используем
nonlocaldef outer():
x = 10 # Переменная из enclosing-области
def inner():
nonlocal x
x = 20 # Меняем `x` в `outer()`
inner()
print(x) # 20
outer()
🚩Что если переменная отсутствует во всех областях?
Если переменная не найдена в LEGB, Python выдаст
NameErrordef func():
print(y) # Ошибка: y не объявлена!
func()
Ошибка
NameError: name 'y' is not defined
🚩`Built-in` — встроенные функции
Python в последнюю очереде проверяет встроенные функции (
print(), len(), sum() и т. д.). print = "Ошибка!" # Переопределили встроенную функцию
print("Hello") # TypeError: 'str' object is not callable
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Что такое await?
await — ключевое слово в Python, которое приостанавливает выполнение функции, пока не завершится корутина или awaitable-объект. Оно передаёт управление event loop'у, позволяя другим задачам выполняться в это время.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
await — ключевое слово в Python, которое приостанавливает выполнение функции, пока не завершится корутина или awaitable-объект. Оно передаёт управление event loop'у, позволяя другим задачам выполняться в это время.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Какие есть методы чтобы реализовать протокол итерирования данных?
Для реализации протокола итерирования данных в Python необходимо использовать два метода:
🚩Протокол итератора
🟠Метод `__iter__()`
Этот метод должен возвращать объект-итератор. В простом случае он возвращает сам объект, если объект реализует метод
🟠Метод
Этот метод возвращает следующий элемент в последовательности. Когда элементы заканчиваются, метод должен вызвать исключение
🚩Дополнительно: итераторы и генераторы
Для упрощения создания итераторов в Python можно использовать генераторы. Генераторы позволяют писать итераторы с использованием ключевого слова
Ставь 👍 и забирай 📚 Базу знаний
Для реализации протокола итерирования данных в Python необходимо использовать два метода:
__iter__() и __next__().🚩Протокол итератора
🟠Метод `__iter__()`
Этот метод должен возвращать объект-итератор. В простом случае он возвращает сам объект, если объект реализует метод
__next__(). Метод __iter__() необходим для того, чтобы объект можно было использовать в конструкциях, которые требуют итерируемого объекта, таких как циклы for.🟠Метод
__next__()Этот метод возвращает следующий элемент в последовательности. Когда элементы заканчиваются, метод должен вызвать исключение
StopIteration для остановки итерации.class MyRange:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start
def __iter__(self):
self.current = self.start # Перезапуск итератора при каждом вызове
return self
def __next__(self):
if self.current >= self.end:
raise StopIteration
else:
self.current += 1
return self.current - 1
# Использование
for number in MyRange(1, 5):
print(number)
🚩Дополнительно: итераторы и генераторы
Для упрощения создания итераторов в Python можно использовать генераторы. Генераторы позволяют писать итераторы с использованием ключевого слова
yield вместо определения методов __iter__() и __next__() вручную.def my_range(start, end):
current = start
while current < end:
yield current
current += 1
# Использование
for number in my_range(1, 5):
print(number)
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое dunder методы?
Это специальные методы, обрамлённые двойными подчёркиваниями.
1. Пример: init, str, add.
2. Они позволяют изменять поведение встроенных операций, таких как создание объектов или арифметика.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Пример: init, str, add.
2. Они позволяют изменять поведение встроенных операций, таких как создание объектов или арифметика.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Что такое деструктор класса?
Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В Python этот метод называется
🚩Определение и использование деструктора
Определяется внутри класса с помощью метода
🟠Класс
🟠Метод
🟠Деструктор
🚩Создание и уничтожение объекта
Когда объект класса создается, вызывается конструктор. Когда объект больше не нужен, вызывается деструктор:
🚩Важные замечания
🟠Сборка мусора
Python использует механизм сборки мусора для автоматического управления памятью. Когда объект больше не используется (например, нет активных ссылок на него), сборщик мусора удаляет объект и вызывает его деструктор.
🟠Неопределенное время вызова
Точное время вызова деструктора зависит от работы сборщика мусора. Это означает, что нельзя гарантировать момент вызова деструктора. Поэтому для критических операций лучше использовать явное управление ресурсами, например, с помощью контекстных менеджеров (
🟠Контекстные менеджеры
Для явного управления ресурсами и их освобождения в предсказуемый момент лучше использовать контекстные менеджеры.
Ставь 👍 и забирай 📚 Базу знаний
Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В Python этот метод называется
__del__(). Деструктор используется для выполнения операций очистки, таких как освобождение ресурсов или выполнение завершающих действий перед тем, как объект будет удален из памяти.🚩Определение и использование деструктора
Определяется внутри класса с помощью метода
__del__(). class FileManager:
def __init__(self, filename):
self.file = open(filename, 'w')
print(f"Файл {filename} открыт для записи.")
def write_data(self, data):
self.file.write(data)
def __del__(self):
self.file.close()
print("Файл закрыт.")
🟠Класс
FileManager имеет конструктор __init__(), который открывает файл для записи.🟠Метод
write_data() записывает данные в файл.🟠Деструктор
__del__() закрывает файл, когда объект FileManager уничтожается.🚩Создание и уничтожение объекта
Когда объект класса создается, вызывается конструктор. Когда объект больше не нужен, вызывается деструктор:
manager = FileManager('example.txt')
manager.write_data('Hello, world!')
# Когда объект manager больше не нужен, вызывается деструктор и файл закрывается🚩Важные замечания
🟠Сборка мусора
Python использует механизм сборки мусора для автоматического управления памятью. Когда объект больше не используется (например, нет активных ссылок на него), сборщик мусора удаляет объект и вызывает его деструктор.
🟠Неопределенное время вызова
Точное время вызова деструктора зависит от работы сборщика мусора. Это означает, что нельзя гарантировать момент вызова деструктора. Поэтому для критических операций лучше использовать явное управление ресурсами, например, с помощью контекстных менеджеров (
with).🟠Контекстные менеджеры
Для явного управления ресурсами и их освобождения в предсказуемый момент лучше использовать контекстные менеджеры.
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Файл автоматически закрывается после выхода из блока withСтавь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое cls
1. cls — это ссылка на сам класс, аналог self для объектов.
2. Используется в методах класса (помеченных декоратором @classmethod ) для доступа к атрибутам или созданию новых экземпляров.
3. Пример: def create_instance(cls): return cls().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
2. Используется в методах класса (помеченных декоратором
3. Пример: def create_instance(cls): return cls().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3💊1
🤔 Как сгенерировать и применить миграцию?
В Django миграции используются для изменения структуры базы данных (создание, изменение и удаление таблиц и полей).
🚩Генерация миграции (`makemigrations`)
🟠Создаём или изменяем модель (`models.py`)
Пример модели пользователя:
🟠Генерируем миграцию
Запускаем команду:
Django создаст файл миграции в
Проверяем SQL-запрос, который будет выполнен
🚩Применение миграции (`migrate`)
После генерации нужно применить миграции к базе данных:
🚩Что делать, если модель изменилась?
Добавим поле в
Сгенерируем новую миграцию
Применяем изменения к БД
🚩Откат миграций (`migrate <номер>`)
Если нужно откатить последнее изменение:
Ставь 👍 и забирай 📚 Базу знаний
В Django миграции используются для изменения структуры базы данных (создание, изменение и удаление таблиц и полей).
🚩Генерация миграции (`makemigrations`)
🟠Создаём или изменяем модель (`models.py`)
Пример модели пользователя:
from django.db import models
class UserProfile(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
🟠Генерируем миграцию
Запускаем команду:
python manage.py makemigrations
Django создаст файл миграции в
migrations/ migrations/
0001_initial.py # Файл с SQL-изменениями
Проверяем SQL-запрос, который будет выполнен
python manage.py sqlmigrate myapp 0001
🚩Применение миграции (`migrate`)
После генерации нужно применить миграции к базе данных:
python manage.py migrate
🚩Что делать, если модель изменилась?
Добавим поле в
models.py class UserProfile(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
email = models.EmailField(default="example@example.com") # Добавили поле
Сгенерируем новую миграцию
python manage.py makemigrations
Применяем изменения к БД
python manage.py migrate
🚩Откат миграций (`migrate <номер>`)
Если нужно откатить последнее изменение:
python manage.py migrate myapp 0001 # Откат до первой миграции
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое set?
Это специальный метод в Python, который используется в дескрипторах. Он позволяет определить, как объект класса будет вести себя при установке значения через точку. Например, он может автоматически проверять или преобразовывать значение перед сохранением.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это специальный метод в Python, который используется в дескрипторах. Он позволяет определить, как объект класса будет вести себя при установке значения через точку. Например, он может автоматически проверять или преобразовывать значение перед сохранением.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Как избежать конфликтов при импорте файлов?
Когда в проекте много файлов, могут возникать конфликты импортов. Python ищет модули в определённом порядке, и если несколько файлов имеют одинаковые имена или неправильные пути, может возникнуть ошибка.
🚩Способы избежать конфликтов при импорте
🟠Используйте явные пути импорта
Вместо
Лучше указывать полный путь в пакетах
🟠Избегайте конфликтов имён файлов
Если у вас есть файл
- Не называйте файлы именами стандартных модулей:
- Проверьте, какой именно модуль загружается:
🟠Добавьте `__init__.py` в пакеты
Если у вас есть структура
Решение
Добавьте пустой
Теперь импорт будет работать
🟠Используйте `sys.path.append()` для указания путей
Иногда Python не находит модуль, если он находится вне стандартных путей. Решение
Добавьте путь вручную:
🟠Используйте `absolute` и `relative` импорт в пакетах
Абсолютный импорт (рекомендуется)
Относительный импорт (используется внутри пакетов):
🟠Проверяйте `sys.modules` и `sys.path`
Если импорт не работает, проверьте, какие модули загружены и где Python ищет файлы
Ставь 👍 и забирай 📚 Базу знаний
Когда в проекте много файлов, могут возникать конфликты импортов. Python ищет модули в определённом порядке, и если несколько файлов имеют одинаковые имена или неправильные пути, может возникнуть ошибка.
🚩Способы избежать конфликтов при импорте
🟠Используйте явные пути импорта
Вместо
import mymodule # Может вызвать конфликт, если есть несколько файлов с таким именем
Лучше указывать полный путь в пакетах
from myproject.utils.mymodule import my_function
🟠Избегайте конфликтов имён файлов
Если у вас есть файл
math.py, импорт import math будет загружать ваш файл, а не стандартный модуль math из Python. - Не называйте файлы именами стандартных модулей:
math.py, sys.py, json.py. - Проверьте, какой именно модуль загружается:
import math
print(math.__file__) # Путь к загруженному модулю
🟠Добавьте `__init__.py` в пакеты
Если у вас есть структура
/myproject
/utils
mymodule.py
Решение
Добавьте пустой
__init__.py в utils/: /myproject
/utils
__init__.py # Делаем utils пакетом
mymodule.py
Теперь импорт будет работать
from utils import mymodule
🟠Используйте `sys.path.append()` для указания путей
Иногда Python не находит модуль, если он находится вне стандартных путей. Решение
Добавьте путь вручную:
import sys
sys.path.append("/path/to/directory")
import mymodule # Теперь импорт будет работать
🟠Используйте `absolute` и `relative` импорт в пакетах
Абсолютный импорт (рекомендуется)
from myproject.utils.mymodule import my_function
Относительный импорт (используется внутри пакетов):
from .mymodule import my_function
🟠Проверяйте `sys.modules` и `sys.path`
Если импорт не работает, проверьте, какие модули загружены и где Python ищет файлы
import sys
print(sys.modules.keys()) # Список загруженных модулей
print(sys.path) # Пути, где Python ищет модули
Ставь 👍 и забирай 📚 Базу знаний
👍1