JuniorPython Developer > Основы Python > Коллекции и структуры данных
Короткий ответ Список — изменяемая коллекция: его содержимое можно менять после создания. Кортеж — неизменяемый: элементы задаются один раз, и изменить их нельзя. Как это работает подробнее Разница в изменяемости влечёт важные практические следствия. Хешируемость. Кортеж можно использовать как ключ словаря или элемент множества, а список — нет, поскольку он изменяем. Память и скорость. Кортеж обычно занимает меньше памяти и создаётся быстрее, чем список с теми же элементами. Соглашение о данных. Список принято использовать для однородных последовательностей, а кортеж — для разнородных, фактически как запись, например пара «адрес и порт». Один элемент. Кортеж из одного элемента создаётся только с запятой: (1,), иначе (1) — просто число в скобках. Что использовать на практике Изменяемые данные. Если элементы нужно дополнять, удалять или сортировать на месте — выбирай список. Неизменяемый контракт. Для фиксированного набора значений, ключа словаря или быстрого доступа к набору данных подходит кортеж. Структуры-з
data-structuresimmutable
JuniorDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Управляемая база данных снимает с команды рутинные задачи — установку и патчинг СУБД, настройку резервного копирования, мониторинг места и производительности, организацию отказоустойчивости — оставляя управление схемой и запросами; взамен ограничивается прямой доступ к ОС и часть настроек движка. Как это работает подробнее провайдер автоматизирует создание резервных копий по расписанию, point-in-time recovery, применение патчей безопасности в обслуживаемое окно, а также предлагает встроенные механизмы отказоустойчивости. Пример кода Что использовать на практике Рекомендация. управляемую БД выбирают по умолчанию для типовых реляционных нагрузок, если не требуется специфичная версия/расширение/доступ к файловой системе; самостоятельная установка на ВМ нужна для нестандартных конфигураций. Проверка. вывод показывает статус инстанса, включён ли Multi-AZ, и срок хранения автоматических бэкапов в днях. Подводные камни Риск. считать, что управляемая БД не требует настройки резервного копирования и мон
azure-databasecloud-sql
JuniorPython Developer > Основы Python > Потоки и синхронизация
Короткий ответ Процессы — независимые экземпляры интерпретатора с собственной памятью и своим GIL, что даёт реальный параллелизм на нескольких ядрах; потоки работают внутри одного процесса, делят общую память и один GIL, что в CPython ограничивает параллелизм для CPU-bound кода. Как это работает подробнее multiprocessing создаёт отдельные ОС-процессы с собственным адресным пространством памяти — обмен данными между ними требует межпроцессного взаимодействия (pickle, очереди). threading создаёт потоки в рамках одного процесса с общей памятью, что упрощает обмен данными, но ограничено одним GIL в CPython. Пример кода Что использовать на практике Практика. Для CPU-bound нагрузки процессы дают реальное распараллеливание на несколько ядер, тогда как потоки для этой задачи почти бесполезны в CPython. Для I/O-bound нагрузки потоки — лёгкий способ параллельно ждать несколько операций, так как GIL освобождается во время блокирующего I/O. Подводные камни Риски. Используют multiprocessing для простого I/O-bound параллел
concurrencypython
JuniorPython Developer > Основы Python > FastAPI и Pydantic
Короткий ответ Path-параметр — обязательная часть самого URL, идентифицирующая конкретный ресурс (например, /users/42); query-параметр передаётся после ? и обычно используется для фильтрации, сортировки или пагинации. Как это работает подробнее В FastAPI path-параметр объявляется в шаблоне маршрута через {имя} и обязателен — без него маршрут просто не совпадёт. Query-параметр не входит в шаблон пути: любой параметр функции, не являющийся path-параметром или моделью тела, по умолчанию становится query-параметром. Пример кода Что использовать на практике Практика. Path используют для идентификации сущности (/orders/{order_id}), query — для необязательных модификаторов списка (/orders?status=paid&page=2). Это соответствует общепринятым REST-конвенциям и упрощает кэширование и логирование по пути. Подводные камни Риск. Передают идентификатор ресурса как query-параметр (/orders?order_id=5) вместо пути, что ломает REST-семантику и усложняет кэширование; делают обязательные фильтры query-параметрами без значения по
fastapipython
JuniorDevOps Engineer > Контейнеры и доставка > Основы сетей
Короткий ответ TCP — протокол с установлением соединения, гарантирующий доставку, порядок пакетов и контроль перегрузки ценой дополнительных задержек; UDP — протокол без установления соединения и без гарантий доставки/порядка, зато с минимальными накладными расходами и задержкой. Как это работает подробнее TCP использует механизм подтверждений (ACK), повторной передачи потерянных сегментов и скользящего окна для управления скоростью отправки, что требует хранения состояния соединения на обеих сторонах; UDP просто отправляет датаграммы в сеть без подтверждений и без состояния соединения. Пример кода Что использовать на практике Практика. TCP выбирают, когда важна целостность и порядок данных (HTTP, базы данных, SSH), а UDP — когда важнее низкая задержка и допустима потеря части данных или надёжность реализуется на уровне приложения (DNS-запросы, стриминг видео, игры, протоколы телеметрии вроде части gRPC/QUIC поверх UDP). Подводные камни Риск. Частая ошибка — считать UDP «ненадёжным и поэтому плохим протоколом
networkingnetwork-protocols
JuniorPython Developer > Основы Python > WSGI, ASGI и серверы приложений
Короткий ответ WSGI поддерживает только синхронную модель «один запрос — один вызов приложения», а ASGI поддерживает async/await, WebSocket и долгоживущие соединения, что необходимо для приложений на FastAPI, Starlette или Django Channels. Как это работает подробнее WSGI-приложение — синхронная функция, вызываемая один раз на запрос; ASGI-приложение — корутина с интерфейсом scope, receive, send, способная обрабатывать несколько сообщений за «соединение» без блокировки потока. Пример кода Что использовать на практике Рекомендация. ASGI нужен для WebSocket, Server-Sent Events или когда хочется обслуживать много I/O-bound соединений одним процессом. Для обычного CRUD-приложения выигрыш зависит от того, насколько код реально асинхронный. Подводные камни Риск. считать ASGI «быстрее WSGI» по умолчанию без учёта профиля нагрузки; пытаться запустить WSGI-приложение через ASGI-сервер без адаптера.
application-serverasgi
MiddleDevOps Engineer > Контейнеры и доставка > Мониторинг, логирование и observability
Короткий ответ rate() возвращает среднюю скорость роста counter в секунду за указанное окно, increase() — абсолютный прирост за это же окно (фактически rate() * размер_окна_в_секундах); обе функции автоматически учитывают и компенсируют сбросы counter (например, при перезапуске процесса), но требуют именно counter, а не gauge. Как это работает подробнее counter может быть сброшен в 0 при перезапуске процесса; rate()/increase() обнаруживают такие "скачки назад" между соседними точками и корректно интерпретируют их как сброс, а не как отрицательный рост. increase() экстраполирует значение на весь интервал окна на основе доступных точек, что при малом количестве точек в окне (например, окно меньше scrape interval) может давать не совсем точный результат. Пример кода Что использовать на практике Практика. для построения алертов и дашбордов "скорость в секунду" обычно удобнее rate(), а для разовых отчётов "сколько всего ошибок произошло за час" — increase(). Окно должно быть минимум в 2–4 раза больше scrape interv
monitoringobservability
JuniorPython Developer > Основы Python > Основы Python
Короткий ответ == проверяет равенство значений двух объектов, а is — ссылаются ли переменные на один и тот же объект в памяти. Для сравнения содержимого используют ==, а is — для синглтонов вроде None. Как это работает подробнее Результаты операторов могут расходиться: одинаковые значения часто хранятся в разных объектах. Равенство значений. == сравнивает содержимое объектов и возвращает true, когда оно эквивалентно, даже если объекты разные. Идентичность. is истинен только когда обе переменные хранят ссылку на один и тот же объект. Синглтоны. None, True и False существуют в единственном экземпляре, поэтому сравнение через is надёжно и быстрее. Пример кода Что использовать на практике Сравнение значений. Для строк, списков, чисел и других данных всегда применяй ==. Проверка на None. Используй идиоматичную запись x is None — она надёжна и быстрее. Осторожность с is. Для значений на is не полагайся: интерпретатор может кэшировать объекты. Подводные камни Кэш малых чисел. CPython переиспользует целые от -5 до 25
comparisonequality
JuniorDevOps Engineer > Контейнеры и доставка > Файловые системы Linux
Короткий ответ Жёсткая ссылка — ещё одно имя для того же inode на той же файловой системе, symlink — отдельный файл, хранящий путь к другому файлу и может указывать на другой раздел или вообще на несуществующий путь. Как это работает подробнее Жёсткие ссылки работают на уровне inode: все имена равноправны, и файл физически удаляется только когда счётчик ссылок (link count) становится нулём. Symlink — это специальный файл с содержимым-путём, который резолвится заново при каждом обращении. Пример кода Что использовать на практике Практика. Жёсткие ссылки нельзя создать на каталог и нельзя протянуть между разными файловыми системами, поэтому для кросс-FS ссылок и для ссылок на каталоги используют symlink; при переносе или архивировании важно помнить, что tar по умолчанию может как сохранять, так и разворачивать symlink в зависимости от флагов. Подводные камни Риск. Частая ошибка — думать, что удаление исходного файла сломает жёсткую ссылку: на самом деле данные остаются доступны, пока жив хотя бы один link; для
filesystemshard-links
JuniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ terraform plan только вычисляет и показывает, какие изменения будут внесены, не трогая реальную инфраструктуру, а terraform apply выполняет эти изменения (и по умолчанию сам формирует план перед выполнением, запрашивая подтверждение). Как это работает подробнее plan строит граф различий между кодом/state и реальным состоянием ресурсов через API-запросы к провайдеру и выводит список действий (create / update in-place / destroy and re-create / destroy) без побочных эффектов, кроме, иногда, обновления данных state при чтении. Пример кода Что использовать на практике Практика. в CI/CD план обычно сохраняется в файл (terraform plan -out=plan.tfplan) и прикладывается к Pull Request для review, а затем именно этот сохранённый план применяется (terraform apply plan.tfplan), чтобы между просмотром и применением инфраструктура не успела измениться. Подводные камни Ошибка. запускать apply без предварительного plan в проде "чтобы быстрее"; не замечать в выводе плана строку с destroy для важного ресурса (на
configuration-managementenvironment-management