MiddlePython Developer > Основы Python > Тестирование кода
Короткий ответ Модульные тесты проверяют отдельные компоненты по отдельности, в изоляции от остальной системы. Интеграционные тесты проверяют взаимодействие модулей между собой и корректность работы с внешними зависимостями, такими как база данных или API. Как это работает подробнее Эти виды тестирования отвечают на разные вопросы и выполняются на разных этапах. Изоляция. Unit-тест проверяет, корректно ли работает отдельная функция или класс сама по себе; при падении сразу видно, какой компонент сломался. Автор и скорость. Модульные тесты обычно пишет разработчик во время разработки, выполняются они быстро и считаются «белым ящиком». Интеграция. Интеграционные тесты ищут дефекты во взаимодействии собранных модулей и их стыках с окружением. Порядок и стоимость. Интеграционное тестирование идёт после модульного и до системного, но оно медленнее и дороже и чаще проводится тестировщиками. Что использовать на практике Пирамида тестов. Основу держи на быстрых модульных тестах, а интеграционные добавляй для критичны
integration-testspython
MiddlePython Developer > Основы Python > Основы Python
Короткий ответ Все три выражения вернут False, хотя на первый взгляд кажутся истинными. Причина — цепочечные сравнения: выражение вида a op1 b op2 c раскрывается в (a op1 b) and (b op2 c). Как это работает подробнее Выражение читается не как последовательность независимых операций, а как логическая конъюнкция, в которой средний операнд участвует дважды. Первое выражение. 11 > 0 is True эквивалентно (11 > 0) and (0 is True): первая часть истинна, но 0 is True ложно, ведь это разные объекты. Второе выражение. 0 разворачивается в (0 ; первое сравнение ложно, поэтому ложно всё выражение. Третье выражение. 1 in range(2) == True — это (1 in range(2)) and (range(2) == True): вхождение истинно, но сравнение объекта range с True ложно. Сила скобок. Явные скобки меняют результат: (11 > 0) is True вернёт True, так как сначала вычисляется сравнение, а затем проверяется его результат. Пример кода Что использовать на практике Читай по правилам. Помни, что сравнения в Python выстраиваются в цепочку через неявное and, а не в
boolean-logicchained-comparisons
JuniorPython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ Метод __init__() автоматически вызывается при создании объекта класса и инициализирует атрибуты экземпляра начальными значениями. Параметр self — ссылка на сам создаваемый экземпляр, через которую метод сохраняет данные и обращается к другим членам этого объекта. Как это работает подробнее Важно понимать, что __init__() не создаёт объект, а лишь настраивает уже выделенный экземпляр. Роль конструктора. __init__() — аналог конструктора из других объектно-ориентированных языков: он срабатывает в момент создания экземпляра и задаёт начальное состояние. Выделение памяти. Память под объект выделяет метод __new__(), который вызывается раньше, а __init__() заполняет атрибуты уже готового экземпляра. Назначение self. Первый параметр любого метода экземпляра — ссылка на конкретный объект; через присваивания вида self.value = ... каждый экземпляр получает собственные данные. Имя параметра. Название self — лишь соглашение: важно, чтобы первым параметром передавался сам экземпляр, а имя может быть любым. Пр
constructorsinit
MiddleJava Developer > Java Core > Spring
Короткий ответ @SpringBootApplication — основная аннотация класса запуска Spring Boot-приложения. Она является составной и объединяет три аннотации: @Configuration, @EnableAutoConfiguration и @ComponentScan. Как это работает подробнее Запуск выполняет метод SpringApplication.run(...): создаётся ApplicationContext, выполняется сканирование компонентов, применяется авто-конфигурация, загружаются свойства конфигурации и запускается встроенный веб-сервер. Авто-конфигурация анализирует, какие зависимости есть в classpath (какие стартеры подключены), и на их основе сама создаёт и настраивает нужные бины — например, DataSource или EntityManagerFactory. Составляющие аннотации: @Configuration помечает класс как источник бинов, @EnableAutoConfiguration включает авто-конфигурацию, а @ComponentScan сканирует пакет главного класса и подпакеты в поисках @Component, @Service, @Repository, @Controller. Условные аннотации — @ConditionalOnClass, @ConditionalOnBean, @ConditionalOnMissingBean — включают конфигурацию только при в
autoconfigurationcomponentscan
JuniorPython Developer > Основы Python > Базы данных и SQL
Короткий ответ SELECT выбирает данные из базы: возвращаемые данные помещаются в результирующую таблицу (result-set). Вместе с ним используются WHERE для фильтрации записей, ORDER BY для сортировки, GROUP BY с агрегатными функциями для сводных результатов, HAVING для фильтрации групп и DISTINCT для уникальных записей. Как это работает подробнее SELECT — один из стандартных операторов языка SQL, а перечисленные предложения уточняют, какие строки и в каком виде вернёт запрос. WHERE. Фильтрует записи по конкретным условиям, например WHERE graduation_year = 2019. ORDER BY. Сортирует записи по одному или нескольким полям в возрастающем или убывающем порядке: ORDER BY studentID DESC. GROUP BY. Группирует записи с одинаковыми значениями и применяется вместе с агрегатными функциями для сводных результатов. HAVING. Фильтрует уже сгруппированные записи и, в отличие от WHERE, может накладывать условия на агрегаты. DISTINCT. Возвращает уникальные записи: SELECT DISTINCT StudentID, StudentName FROM Student. Пример кода Что
clausesqueries
MiddlePython Developer > Основы Python > Исключения и контекстные менеджеры
Короткий ответ Внутри блока except для повторного возбуждения того же исключения используют raise без аргументов: сначала выполняют свои действия, например логирование, затем передают ошибку дальше. Такой raise сохраняет исходный traceback и работает только в обработчике. Как это работает подробнее Приём полезен, когда на одном уровне нужно залогировать ошибку или дополнить контекст, а окончательное решение об обработке принимает внешний код. Голый raise. Повторно возбуждает именно текущее исключение, поэтому работает только внутри блока except. Сохранение traceback. В отличие от raise с новым исключением, исходная цепочка вызовов сохраняется целиком. Ошибка вне except. Использовать голый raise вне обработчика нельзя: возбуждать текущее исключение нечего, и интерпретатор выдаст ошибку. Сцепление исключений. Для замены одного исключения другим с указанием причины пишут raise новое_исключение from старое_исключение. Пример кода Что использовать на практике Логирование. Записывай ошибку в обработчике и пробрасыв
error-handlingexceptions
MiddlePython Developer > Основы Python > Функции и области видимости
Короткий ответ global позволяет изменять внутри функции переменную уровня модуля, а nonlocal — переменную из ближайшей объемлющей функции во вложенных функциях. Без этих ключевых слов присваивание создало бы новую локальную переменную, а не изменило внешнюю. Как это работает подробнее Оба ключевых слова расширяют область видимости, в которой происходит присваивание. Ключевое слово global. Указывает, что имя относится к уровню модуля, поэтому присваивание меняет глобальную переменную, а не создаёт новую локальную. Ошибка без global. Строка вроде count += 1 без global воспринимается как работа с локальной переменной и вызывает UnboundLocalError. Ключевое слово nonlocal. Во вложенной функции ссылается на переменную ближайшей внешней функции, то есть на область между локальной и глобальной. Связь с замыканиями. Механизм позволяет вложенным функциям менять состояние внешней функции, что используется в счётчиках и замыканиях. Пример кода Что использовать на практике Счётчики и состояние. Для накопления состояния во
closuresglobal
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ Обе команды связаны с механизмом миграций — способом Django переносить изменения моделей в схему базы данных. makemigrations создаёт файлы миграций по изменениям моделей, а migrate применяет их к базе данных. Как это работает подробнее Процесс обычно выглядит так: изменили модель, сгенерировали файл миграции, затем применили его к схеме базы данных. Изменение моделей. После правки модели makemigrations сканирует приложение и формирует файл миграции с описанием будущих изменений. Файлы миграций. Содержат инструкции, по сути близкие к SQL, но сами изменения к базе данных пока не применяют. Применение изменений. migrate выполняет инструкции из файлов и создаёт или обновляет таблицы в соответствии с моделями. Версионирование. Миграции хранят историю изменений, поддерживают откат и должны лежать в системе контроля версий. Статус миграций. Служебная команда showmigrations показывает, какие миграции уже применены. Пример кода Что использовать на практике Порядок команд. Сначала makemigrations для гене
djangomakemigrations
MiddleJava Developer > Java Core > ООП
Короткий ответ Ключевое слово final означает запрет на изменение и используется в трёх основных смыслах: final-переменной значение присваивается только один раз, final-метод нельзя переопределить в наследнике, а от final-класса нельзя создавать подклассы. Именно так устроены String, Integer и другие классы-обёртки. Как это работает подробнее Если final стоит у ссылки на объект, менять саму ссылку нельзя, но состояние объекта по ней — можно (если объект сам не неизменяемый). final применяется и к параметрам методов: такой параметр нельзя переприсваивать внутри метода. Неизменяемые объекты, все поля которых объявлены final, безопасно публиковать и использовать в многопоточной среде без синхронизации. final-переменная — константа: присваивание при объявлении или в конструкторе, далее только чтение; переприсваивание даёт ошибку компиляции. final-метод — реализация зафиксирована в родительском классе и не может быть переопределена в подклассах. final-класс — наследование запрещено, поэтому поведение класса гаранти
finalimmutability
JuniorJava Developer > Java Core > Основы Java
Короткий ответ Компилятор автоматически добавит так называемый конструктор по умолчанию — конструктор без параметров, тело которого состоит из вызова конструктора родителя super(). Благодаря этому объект класса по-прежнему можно создать оператором new, а цепочка конструкторов корректно строится от базового класса к производному. Как это работает подробнее Конструктор по умолчанию добавляется только в одном случае: если в классе нет вообще ни одного конструктора. Если программист объявил хотя бы один конструктор, например Book(String title), автоматический конструктор не создаётся, и для new Book() понадобится явный конструктор без параметров. Видимость сгенерированного конструктора совпадает с видимостью класса. Условие генерации — в классе не объявлено ни одного конструктора; иначе компилятор не добавляет ничего. Вызов super() — у родителя должен быть доступный конструктор без параметров; иначе наследник обязан явно вызвать подходящий super(...). Роль — корректно проинициализировать объект и построить цепочк
constructorsdefault-constructor