MiddlePython Developer > Основы Python > Тестирование кода
Короткий ответ Mock — это объект-заглушка, который подменяет реальную зависимость, чтобы тест не обращался к сети, базе данных или окружению. unittest.mock даёт mock-объекты и декоратор patch() для подмены атрибутов, а фикстура monkeypatch из pytest безопасно меняет атрибуты, элементы словарей и переменные окружения с автоматическим откатом. Как это работает подробнее Внешние зависимости не вызываются по-настоящему: вместо них в тест подставляются заглушки с известным поведением, что делает тест быстрым и детерминированным. Mock-объекты. unittest.mock избавляет от ручного создания стабов: после действия проверяют, какие методы и с какими аргументами вызывались, например через mock.method.assert_called_with(...). Настройка поведения. Заглушке задают возвращаемое значение через return_value или заставляют вызов бросить исключение через side_effect. Патчинг. Декоратор patch() подменяет атрибуты модулей и классов в пределах области действия теста. Фикстура monkeypatch. В pytest меняет атрибуты, элементы словарей
mockmonkeypatch
MiddlePython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ MRO (Method Resolution Order) — порядок, в котором Python обходит классы при поиске метода или атрибута, особенно когда в иерархии несколько уровней или родителей. Интерпретатор просматривает классы строго в этом порядке и использует первое найденное определение. Как это работает подробнее Просмотр порядка. Посмотреть последовательность для конкретного класса можно методом mro() или атрибутом __mro__. Алгоритм C3. В классах нового стиля порядок строится по C3-линеаризации, которая обходит иерархию в ширину и не даёт классу появиться раньше своих родителей. Связь с super(). super() вызывает следующий класс согласно MRO относительно точки вызова, поэтому предсказать поведение без знания порядка нельзя. Значимость. Понимание MRO критично при множественном наследовании, когда нужно определить, какой из одноимённых методов будет выполнен. Пример кода Что использовать на практике Диагностика. При сомнениях выводи Класс.mro() и проверяй, какая реализация метода будет вызвана. Проектирование. Осознанно
method-resolutionmro
MiddlePython Developer > Основы Python > ООП и модель объектов
Короткий ответ MRO — это детерминированный порядок, в котором Python ищет метод или атрибут по цепочке классов при множественном наследовании, вычисляемый по алгоритму C3-линеаризации; узнать точный порядок для конкретного класса можно через ClassName.__mro__ или ClassName.mro(). Как это работает подробнее C3-линеаризация строит порядок так, чтобы класс всегда шёл раньше своих родителей, а относительный порядок родителей, указанных в определении класса, сохранялся — это даёт единый непротиворечивый порядок обхода даже для сложных диаграмм наследования. super() внутри метода использует именно этот порядок, переходя к следующему классу в MRO текущего экземпляра, а не напрямую к "родителю" в обычном понимании. Пример кода Что использовать на практике Практика. Понимание MRO важно для классов-миксинов (mixin), где функциональность собирается из нескольких небольших классов: порядок перечисления родителей в class Combined(MixinA, MixinB, Base): определяет, какая реализация метода будет вызвана первой. При конфликт
inheritanceobject-model
MiddleDevOps Engineer > Контейнеры и доставка > TCP/IP
Короткий ответ MTU задаёт максимальный размер IP-пакета без фрагментации. В туннелях служебные заголовки уменьшают доступный MTU: крупные пакеты могут теряться при блокировке ICMP, поэтому проверяют Path MTU Discovery и настраивают меньший MTU или MSS clamping. Как это работает подробнее Когда пакет превышает MTU промежуточного канала и установлен флаг Don't Fragment (DF), маршрутизатор обязан отбросить пакет и отправить обратно ICMP Fragmentation Needed; механизм Path MTU Discovery (PMTUD) должен использовать этот ICMP-ответ, чтобы отправитель уменьшил размер последующих пакетов — но если этот ICMP-пакет заблокирован файрволом где-то на пути, отправитель никогда не узнаёт о проблеме и соединение просто зависает на передаче больших данных (классический симптом: SSH-сессия устанавливается и держит маленькие команды, но зависает на cat большого файла или scp). Пример кода Что использовать на практике Практика. при туннелях MTU на интерфейсе туннеля нужно явно занижать (например, 1400 вместо 1500) с учётом накла
fragmentationmtu
JuniorPython Developer > Основы Python > Процессы и параллелизм
Короткий ответ multiprocessing.Pool — пул рабочих процессов, которым можно раздавать задачи для параллельного выполнения; он подходит для CPU-bound задач, где нужно реальное параллельное использование нескольких ядер процессора. Как это работает подробнее Pool создаёт заданное число процессов-воркеров; методы map/apply/starmap распределяют входные данные между воркерами, каждый выполняет функцию в своём процессе с собственным GIL, а результаты сериализуются (pickle) и возвращаются в основной процесс. Пример кода Что использовать на практике Практика. Pool эффективен для однотипных вычислительно тяжёлых задач над набором входных данных (обработка изображений, числовые расчёты), когда объём работы на одну задачу существенно больше накладных расходов на создание процесса и передачу данных. Подводные камни Риски. Передают в Pool функции с несериализуемыми объектами — pickle падает с ошибкой; используют Pool для задач с частым обменом небольшими данными, где издержки межпроцессного взаимодействия превышают выигрыш
cpu-boundmultiprocessing
JuniorDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Namespace — это логическая область видимости внутри одного кластера, позволяющая разделять ресурсы (Pod, Service, ConfigMap и т.д.) между командами, окружениями или проектами и независимо применять к ним квоты и права доступа. Как это работает подробнее большинство объектов Kubernetes (кроме, например, Node и PersistentVolume, которые кластерного уровня) существуют внутри namespace; имена объектов должны быть уникальны только в пределах одного namespace, а не всего кластера. RBAC, ResourceQuota и NetworkPolicy можно применять именно на уровне namespace. Пример кода Что использовать на практике Практика. namespace часто используют для разделения окружений (dev, staging, prod) в одном кластере или для изоляции команд/продуктов в общем кластере, сочетая с RBAC и квотами ресурсов. DNS-имя сервиса включает namespace (svc.namespace.svc.cluster.local), что позволяет иметь одноимённые сервисы в разных namespace. Подводные камни Риски. полагать, что namespace обеспечивает полную сетевую изоляцию "из кор
kubernetesmulti-tenancy
MiddlePython Developer > Основы Python > Функции и области видимости
Короткий ответ nonlocal позволяет функции, вложенной в другую функцию, изменять переменную из области видимости объемлющей (не глобальной) функции, тогда как global всегда ссылается на переменную модульного уровня — без nonlocal попытка присвоить значение внешней переменной внутри вложенной функции создаёт новую локальную переменную во вложенной функции. Как это работает подробнее Python следует правилу LEGB (Local, Enclosing, Global, Built-in) при поиске имени для чтения, но для присваивания переменной по умолчанию выбирается самая внутренняя (Local) область видимости. nonlocal name явно указывает интерпретатору искать и изменять name в ближайшей объемлющей функции (Enclosing), а не создавать новую локальную переменную во вложенной функции. Пример кода Что использовать на практике Практика. Типичный случай — функция-фабрика, создающая счётчик, аккумулятор или кэш внутри замыкания: внутренняя функция должна изменять состояние, "принадлежащее" внешней функции, между вызовами. Это распространённый паттерн до по
functions-scopeglobal
JuniorData Analyst > Метрики и эксперименты > A/B-тесты
Короткий ответ Novelty effect — это временный всплеск реакции пользователей (положительной или отрицательной) просто из-за того, что изменение новое и непривычное, а не из-за его реальной долгосрочной ценности. Со временем, когда пользователи привыкают, эффект может ослабнуть или исчезнуть. Как это работает подробнее новый дизайн или фича привлекает внимание, пользователи начинают активнее её исследовать, что краткосрочно повышает вовлечённость независимо от того, улучшает ли изменение продукт на самом деле. Пример: в первую неделю теста CTR новой кнопки +15% относительно контроля, но к четвёртой неделе разница сокращается до +2%. Проверка: построить график эффекта по дням/неделям теста — убывающий тренд эффекта к контрольному уровню — характерный признак novelty effect. Что использовать на практике чтобы отличить реальный эффект от novelty effect, тест держат достаточно долго и смотрят на динамику эффекта во времени, а не только на итоговое усреднённое значение. Подводные камни раскатка фичи на всех пользова
dinamika-effektadlitelnost-testa
MiddleData Analyst > SQL и данные > Статистика и теория вероятностей
Короткий ответ Novelty effect — временный всплеск интереса или активности, вызванный самим фактом новизны изменения, а не его долгосрочной ценностью; эффект обычно затухает со временем, поэтому ранние результаты теста могут переоценивать реальный долгосрочный эффект. Как это работает подробнее пользователи реагируют на новое оформление или фичу из любопытства, кликая и исследуя её активнее, чем будут делать это через несколько недель, когда новизна пройдёт. Пример кода Что использовать на практике На практике. чтобы отличить реальный эффект от novelty, полезно смотреть динамику метрики по дням/неделям теста отдельно для новых и для «старых» (ранее видевших прошлую версию) пользователей; если эффект заметно угасает со временем именно у давних пользователей — это признак novelty effect. Для фич с риском такого эффекта разумно продлевать тест дольше обычного и анализировать отдельно когорты по времени первого попадания в группу. Также полезно сравнивать поведение в тестовой группе с историческими данными о похож
ab-testingexperiment-design
JuniorData Analyst > SQL и данные > Python для анализа данных
Короткий ответ NumPy-массив (ndarray) хранит однородные данные одного типа в непрерывном блоке памяти, что позволяет выполнять векторизованные операции быстрее и компактнее, чем над обычным списком Python. Как это работает подробнее список Python хранит ссылки на произвольные объекты, и операции над ним выполняются через интерпретируемый цикл; ndarray хранит значения одного dtype подряд в памяти, а операции (сложение, умножение) реализованы в скомпилированном C-коде и применяются сразу ко всему массиву. Пример кода Что использовать на практике На практике: для числовых расчётов на больших объёмах данных операции с массивами NumPy в разы быстрее, чем цикл for по списку; при этом смешивание типов в массиве (например, числа и строки) приводит к dtype=object и потере преимущества в скорости. Проверка: два вывода наглядно различаются — конкатенация списка против поэлементного сложения массива, что и объясняет разницу поведения. Подводные камни Частые ошибки: складывают списки оператором + и получают конкатенацию в
data-typesndarray