MiddlePython Developer > Основы Python > Тестирование кода
Короткий ответ Параметризация позволяет прогнать один и тот же тест на нескольких наборах аргументов, не дублируя код. В pytest это делает декоратор @pytest.mark.parametrize, которому передаётся строка с именами параметров и список кортежей значений. Как это работает подробнее Декоратор описывает данные, а pytest выполняет тест по разу на каждый набор. Объявление. Декоратор @pytest.mark.parametrize получает строку с именами параметров и список кортежей значений для этих параметров. Выполнение. Тест запускается отдельно для каждого кортежа, и сбой одного набора не останавливает остальные. Отчёт. Каждый прогон выводится отдельно, с указанием значений параметров в имени теста, например test_add[5-5-10]. Граничные случаи. Вместо копий функции вида test_add_1 пишется одна функция, а данные перечисляются в декораторе. Пример кода Что использовать на практике Наборы данных. Перечисляй входные значения и ожидаемый результат в списке кортежей. Краевые случаи. Проверяй граничные значения одним параметризованным тестом
markersparametrization
SeniorJava Developer > Java Core > JPA и Hibernate
Короткий ответ Проблема N+1 — это 1 + N запросов вместо одного оптимального запроса с join: сначала выполняется один SELECT для получения N родительских записей, а затем для каждой из них — ещё по одному запросу за связанными данными. Чаще всего проявляется при ленивой загрузке ассоциаций, когда мы обходим список и у каждой сущности обращаемся к ленивой коллекции. Как это работает подробнее На небольших объёмах проблема незаметна, но с ростом данных производительность резко падает из-за множества обращений к базе. Все техники решения направлены на сокращение числа запросов, а выбор конкретного способа зависит от структуры запроса и сценария чтения. Fetch join: в HQL/JPQL связанные данные подгружаются в том же запросе через JOIN FETCH. @EntityGraph: в Spring Data JPA декларативно описывается граф загрузки — метод репозитория подтягивает указанные атрибуты одним запросом. Batch fetching: @BatchSize(size = 10) на сущности или коллекции грузит связи пачками, сокращая число запросов с N до N/size. EAGER: для связе
entitygraphfetch-join
MiddleJava Developer > Java Core > Spring
Короткий ответ Профили (Profiles) — механизм Spring, позволяющий поддерживать разные конфигурации приложения для разных окружений: разработки (dev), тестирования (test) и продакшена (prod). Бин или класс конфигурации, помеченный @Profile, загружается только тогда, когда соответствующий профиль активирован. Как это работает подробнее Профили разделяют окружение-специфичные настройки: URL базы данных, уровень логирования, параметры интеграций. Это избавляет от ручного изменения конфигурации при переходе между окружениями и помогает защитить продакшен-настройки. Для отдельных профилей создаются файлы вида application-{profile}.properties или application-{profile}.yml, которые переопределяют общие настройки. Способы активации профиля: свойство spring.profiles.active=prod в application.properties, аргумент командной строки --spring.profiles.active=prod или переменная окружения SPRING_PROFILES_ACTIVE. Основной файл конфигурации Spring Boot — application.properties: порт сервера (server.port), подключение к базе дан
configurationenvironment
MiddleJava Developer > Java Core > Multithreading
Короткий ответ Пул потоков — это набор заранее созданных рабочих потоков, которые переиспользуются для выполнения множества задач. Вместо создания нового потока на каждую задачу вы отправляете задачу в пул, её выполняет свободный поток, после чего поток не умирает, а возвращается в пул и ждёт следующую задачу. Пул убирает накладные расходы на создание и уничтожение потоков и ограничивает максимальное число одновременно работающих потоков. Как это работает подробнее В Java пулы реализованы через интерфейс ExecutorService и его основную реализацию ThreadPoolExecutor. Фабричные методы класса Executors: newFixedThreadPool(n) — фиксированное число потоков; newCachedThreadPool() — потоки по мере необходимости с переиспользованием простаивающих; newSingleThreadExecutor() — один рабочий поток с неограниченной очередью; newScheduledThreadPool() — для отложенных и периодических задач. Под капотом ThreadPoolExecutor настраивается параметрами: corePoolSize — основные потоки, maximumPoolSize — максимум, keepAliveTime — вр
executorexecutorservice
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ Сериализация в контексте Django REST Framework — это преобразование сложных Python-объектов, таких как модели и QuerySet, в простые форматы данных, обычно JSON или XML. Обратная операция, десериализация, превращает входящие данные из HTTP-запроса обратно в Python-объекты. Как это работает подробнее Сериализаторы выступают связующим звеном между моделями Django и JSON-представлением данных в REST API. Прямое преобразование. Сериализатор превращает экземпляр модели или QuerySet в данные для ответа API, которые понимает браузер и JavaScript. Обратное преобразование. Входящий JSON десериализуется в Python-объекты для дальнейшей работы серверной логики. Валидация. Встроенные проверки сериализаторов гарантируют, что входящие данные корректны до сохранения в базу данных. Два подхода. Обычный Serializer описывает поля вручную, а ModelSerializer автоматически генерирует поля на основе модели. Пример кода Что использовать на практике ModelSerializer. Для типовых моделей используй ModelSerializer, чтобы п
djangodrf
MiddlePython Developer > Основы Python > Алгоритмы и типовые задачи
Короткий ответ Big O описывает, как растёт время выполнения или потребление памяти алгоритма при увеличении размера входных данных n: O(1) — константно, O(n) — линейно, O(n²) — квадратично. Сортировка пузырьком сравнивает соседние элементы и меняет их местами при нарушении порядка, поэтому из-за вложенных циклов в худшем случае работает за O(n²). Как это работает подробнее О-нотация оценивает асимптотику и худший случай, а не точное время. Пузырёк устроен просто: после каждого полного прохода наибольший элемент «всплывает» в конец неотсортированной части. Смысл нотации. О-нотация задаёт верхнюю границу роста в худшем случае; константы и младшие слагаемые отбрасывают, поэтому 3n² + 2n + 1000 — это O(n²). Константная сложность. O(1) — время не зависит от размера входа: обращение к элементу по индексу или проверка вхождения в set. Линейная сложность. O(n) — время растёт пропорционально n, как при суммировании всех элементов списка одним циклом. Квадратичная сложность. O(n²) появляется при вложенных циклах по одн
algorithmsbig-o
JuniorJava Developer > Java Core > ООП
Короткий ответ Спецификаторы (модификаторы) доступа определяют, из каких мест программы видны классы, поля, методы и конструкторы. В Java четыре уровня: private, package-private (по умолчанию, без модификатора), protected и public. Это практическая реализация инкапсуляции: наружу остаётся только безопасный публичный интерфейс. Как это работает подробнее Уровни доступа перечисляют по нарастанию видимости. private. Самый строгий: член доступен только внутри того же класса; ни наследники, ни другие классы его не видят. package-private (по умолчанию). Модификатор не пишется: член доступен всем классам внутри того же пакета и не виден за его пределами. protected. Член доступен внутри пакета, а также наследникам класса из других пакетов. public. Доступен отовсюду — из любого класса любого пакета, при условии что доступен сам класс. Классы верхнего уровня. Для них применимы только public и package-private: класс не может быть private или protected. Пример кода Что использовать на практике Начинать с private и открыв
access-modifiersencapsulation
JuniorPython Developer > Основы Python > Основы Python
Короткий ответ Срез извлекает часть последовательности по правилу sequence[start:stop:step]: start включается, stop не включается, а step задаёт шаг выборки. Механизм работает со строками, списками, кортежами и объектами range. Как это работает подробнее Срез можно задать квадратными скобками или функцией slice(), а опущенные параметры получают значения по умолчанию. Границы. Начальный индекс включается в результат, конечный — нет, поэтому длина результата зависит от разности границ и шага. Значения по умолчанию. При пропуске start берётся 0, stop — длина последовательности, step — 1. Частые приёмы. s[:3] — первые три элемента, s[3:] — всё после четвёртого, s[::2] — каждый второй, s[::-1] — разворот. Копия. Срез списка создаёт новый список, а не «окно» над исходным, поэтому изменения в срезе не затрагивают оригинал. Пример кода Что использовать на практике Крайние части. Бери начало и конец последовательности срезами s[:n] и s[-n:], не вычисляя длину. Разворот. Разворачивай последовательность срезом s[::-1].
indicespython
JuniorRecruiter > Процесс найма > Оценка кандидатов
Одинаковые вопросы и заранее описанные критерии делают сравнение кандидатов возможным.
ИнтервьюНайм
MiddlePython Developer > Основы Python > Тестирование кода
Короткий ответ Фикстуры нужны, чтобы выполнить код до тест-метода и не повторять подготовку в каждом тесте. Метод помечается декоратором @pytest.fixture, а тест указывает имя фикстуры как параметр: pytest сам вызовет её и передаст возвращённое значение. Как это работает подробнее Обычно с помощью фикстур инициализируют подключения к базе данных, передают базовый URL и готовят другие данные. Назначение. Фикстура избавляет от повторения одного и того же подготовительного кода в каждом тесте. Подключение. Тест объявляет имя фикстуры аргументом, и pytest сам вызывает фикстуру и передаёт результат. Область видимости. Фикстура из тестового файла видна только в нём; общие для нескольких файлов выносят в conftest.py. Поиск. pytest сначала ищет фикстуру в самом тестовом файле, а если не находит — обращается к conftest.py. Scope. По умолчанию фикстура вызывается для каждого теста (function); доступны также class, module, package и session. Пример кода Что использовать на практике conftest.py. Фикстуры, нужные в несколь
fixturespytest