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
SeniorPython Developer > Основы Python > Идемпотентность и транзакции
Короткий ответ Для большинства мультисервисных операций в микросервисной архитектуре предпочтительнее Saga, так как она не требует долгих блокировок и синхронной доступности всех участников одновременно; 2PC/XA рассматривают только в узких случаях, когда участники — это базы данных под общим контролем и бизнес готов терпеть цену в доступности и масштабируемости. Как это работает подробнее Saga выполняет шаги последовательно, коммитя каждый локально и используя компенсации при сбое последующих шагов; 2PC синхронно блокирует ресурсы всех участников на время голосования координатора. 2PC даёт более простое концептуальное рассуждение об атомарности, но снижает доступность операции до доступности самого ненадёжного участника и плохо масштабируется; Saga масштабируется и переживает временную недоступность участников, но перекладывает сложность на явное проектирование и поддержку компенсаций, создавая временные окна неконсистентности. Критерий выбора — количество и природа участников, допустимость временной неконсис
consistencydistributed-transactions
SeniorData Analyst > SQL и данные > Python для анализа данных
Короткий ответ Единственного правильного решения нет: монолитный pipeline в памяти проще и быстрее для небольших и стабильных расчётов, а модульные шаги с промежуточным сохранением лучше подходят для больших, долго выполняющихся или часто отлаживаемых пайплайнов — выбор зависит от объёма данных, частоты сбоев и потребности в отладке отдельных этапов. Как это работает подробнее монолитный подход выполняет все преобразования от сырых данных до финального результата в одном скрипте без сохранения промежуточных состояний, что проще писать и быстрее исполнять за счёт отсутствия лишнего ввода-вывода; модульный подход сохраняет результат каждого значимого шага на диск (parquet/csv), что позволяет перезапускать только упавший или изменившийся шаг, не пересчитывая всё с начала, и облегчает отладку через инспекцию промежуточных файлов. Пример кода Что использовать на практике На практике. для небольших и быстрых расчётов (секунды-минуты) монолитный подход обычно предпочтительнее из-за простоты; для длительных расчётов
checkpointingmodularity
SeniorPython Developer > Основы Python > Согласованность и репликация
Короткий ответ Выбор между строгой и eventual consistency для остатков зависит от того, что дороже бизнесу — продать товар, которого уже нет (overselling), или искусственно снижать доступность/throughput операции покупки из-за блокировок при строгой согласованности; универсального решения нет. Как это работает подробнее Строгая согласованность обычно требует синхронной проверки и резервирования остатка в момент покупки (условное обновление WHERE stock >= qty), что исключает overselling, но ограничивает параллелизм на горячих товарах; eventual consistency допускает локальное/кешированное представление остатка с редким overselling, компенсируемым постфактум. Строгая согласованность снижает риск overselling, но повышает латентность под нагрузкой на горячих товарах и требует постоянной доступности источника правды (узкое место, например, в «чёрную пятницу»); eventual consistency масштабируется лучше и переживает временную недоступность части системы, но требует спроектированного и протестированного процесса компе
consistencydistributed-systems
JuniorPython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ Метод __init__() автоматически вызывается при создании объекта класса и инициализирует атрибуты экземпляра начальными значениями. Параметр self — ссылка на сам создаваемый экземпляр, через которую метод сохраняет данные и обращается к другим членам этого объекта. Как это работает подробнее Важно понимать, что __init__() не создаёт объект, а лишь настраивает уже выделенный экземпляр. Роль конструктора. __init__() — аналог конструктора из других объектно-ориентированных языков: он срабатывает в момент создания экземпляра и задаёт начальное состояние. Выделение памяти. Память под объект выделяет метод __new__(), который вызывается раньше, а __init__() заполняет атрибуты уже готового экземпляра. Назначение self. Первый параметр любого метода экземпляра — ссылка на конкретный объект; через присваивания вида self.value = ... каждый экземпляр получает собственные данные. Имя параметра. Название self — лишь соглашение: важно, чтобы первым параметром передавался сам экземпляр, а имя может быть любым. Пр
constructorsinit
MiddlePython Developer > Основы Python > ООП и модель объектов
Короткий ответ __slots__ объявляет фиксированный, заранее известный набор атрибутов экземпляра и запрещает Python создавать для каждого объекта отдельный __dict__ для произвольных атрибутов — это уменьшает потребление памяти на больших количествах экземпляров, но не позволяет добавлять атрибуты, не перечисленные в __slots__, и требует аккуратности при множественном наследовании. Как это работает подробнее Без __slots__ каждый экземпляр хранит свой словарь атрибутов __dict__, который сам по себе занимает заметный объём памяти, особенно при создании миллионов небольших объектов. __slots__ = ("x", "y") заставляет Python выделить для каждого атрибута компактный дескриптор на уровне класса (slot), а у экземпляров не создаётся __dict__ вообще, что экономит память и немного ускоряет доступ к атрибутам. Пример кода Что использовать на практике Практика. __slots__ имеет смысл применять к классам, которые создаются в больших количествах (элементы кэша, узлы структур данных, DTO в горячем пути), и для которых набор атри
memoryobject-model
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
JuniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ terraform init скачивает и устанавливает указанные providers и модули, инициализирует backend для state и подготавливает рабочую директорию (.terraform) к выполнению plan/apply; без неё Terraform не знает, какие плагины использовать. Как это работает подробнее Terraform читает блоки required_providers и module.source, скачивает нужные версии плагинов провайдеров в .terraform/providers, а модули — в .terraform/modules, и настраивает подключение к backend (например, S3) для хранения state. Пример кода Что использовать на практике Практика. init нужно повторять при клонировании репозитория на новую машину, при добавлении/обновлении провайдера или модуля, при смене backend. В CI/CD это всегда первый шаг пайплайна перед plan. Подводные камни Ошибка. забывать перезапустить init после изменения блока backend (Terraform может продолжать использовать старую конфигурацию до явного terraform init -reconfigure или -migrate-state); коммитить папку .terraform в git, что раздувает репозиторий и может привести
configuration-managementiac
JuniorPython Developer > Основы Python > ООП и модель объектов
Короткий ответ __init__ — это метод-инициализатор, который вызывается автоматически сразу после создания нового объекта класса и используется для присвоения начальных значений атрибутам этого экземпляра; он не создаёт сам объект, а только настраивает уже созданный. Как это работает подробнее Когда пишут obj = MyClass(arg1, arg2), Python сначала вызывает __new__, который фактически создаёт и возвращает новый пустой объект, а затем автоматически вызывает __init__(obj, arg1, arg2) на этом объекте. Для подавляющего большинства классов __new__ переопределять не нужно — достаточно __init__, чтобы задать стартовое состояние. Пример кода Что использовать на практике Практика. В __init__ обычно присваивают переданные аргументы атрибутам через self.attr = value, выполняют простую валидацию входных данных и, при необходимости, вызывают __init__ родительского класса через super().__init__(...), если класс использует наследование. Подводные камни Риски. Путают __init__ с конструктором в смысле "создания объекта" — объект
dunder-methodsobject-initialization
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