Хитрый Питон
2.51K subscribers
4 photos
203 links
Я много читаю и делюсь в этом канале заинтересовавшими меня материалами, в основном про Python. @korneevm
Download Telegram
psycopg3 вышла уже почти три года назад, но я уверен, что многие пока по разным причинам сидят на psycopg 2. Вот тут померяли скорость работы psycopg2 vs psycopg3 и результаты на мой взгляд получились неоднозначные:

1. В обычных select from запросах psycopg3 в три раза быстрее psycopg2. Кажется для большинства проектов, у которых чтения больше записи переход вполне оправдан
2. А вот на всяких более редких кейсах типа batch-записи или получения blob-ов из базы тройка проигрывает двойке

В общем я задумался о том, чтобы проекты, где под капотом psycopg начать переводить на третью версию https://www.timescale.com/blog/psycopg2-vs-psycopg3-performance-benchmark/
Недавно у меня возникла рабочая задача поревьюить кодовую базу - не очень большую, но и не микросервис - порядка 16 тысяч строк. И по результатам мне нужно было сформулировать свои рекомендации и как-то их аргументировать. И вот я понимаю, что во многих местах код переусложнен, но нужно это как-то аргументировать.

И вот тут мне прямо хорошо зашла тула https://github.com/rohaquinlop/complexipy - это штука для оценки cognitive complexity (можно почитать тут https://habr.com/ru/articles/565652/).

На самом деле есть разные тулы для этого, но complexipy мне понравился скоростью, довольно гибкими настройками и в хорошем смысле замороченностью автора, который пошел за ревью к G. Ann Campbell, которая собственно основной автор методики.
Конечно, у любой методики оценки качества кода есть свои минусы, но чем мне нравится этот конкретный вариант - он хорошо показывает куда смотреть и где скорее всего код требует рефакторинга.
Напоминаю, что продолжаются моковые собеседования для тех, кто хочет научиться решать алгоритмы.

Во многих топовых компаниях алгоритмы стали неотъемлемой частью собесов, а для разработчиков — головной болью 💪

Если вы уже прорешали по сотне задачек на LeetCode, но все еще не разобрались, как применять алгоритмы на практике и справляться с незнакомыми заданиями на собеседованиях, тогда мы идем к вам 😁

На стримах вы сможете посмотреть, что спрашивают, как разбирают ответы участников, получить знания и стать увереннее в себе.

Можно позадавать вопросы на трансляции, а можно подать заявку на участие и пройти собеседование в прямом эфире 😉

Сегодня вечером можно прийти посмотреть на первое собеседование по JavaScript по ссылке 🙂 Будет полезно и интересно ☺️
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет!
Наш подкаст теперь будет выходить по четвергам, поэтому 21 марта в 14:00 по МСК встретимся в прямом эфире Moscow Python Podcast со Станиславом Змиевым, Tech Lead of Platform Engineering в Monite и обсудим:
🟡что такое API-First компании и почему они становятся популярными;
🟡как проектировать хорошее API;
🟡что такое API Версионирование и как его правильно готовить.

➡️Когда: 21 марта в 14:00 по Москве.
➡️Где: онлайн и в записи по ссылке.

🟡Станислав уже записывал с нами выпуск про pathlib.Path.walk, запись можете посмотреть по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
Мы у себя в компании начали аккуратно переходить на новый менеджер пакетов uv (https://github.com/astral-sh/uv) и решил рассказать, как все идет.

Так как тула новая, пришлось ждать пока пофиксят 2 бага в которые мы упирались. После чего все равно не заработало, но проблема была уже на нашей стороне. Но самое главное, что после решения этих проблем все работает как часы уже вторую неделю 🙂

Все сложности были при использовании нескольких индексов:
- политика разрешения зависимостей uv отличается от pip - это важно, когда используется свой индекс в добавок к pypi
- авторы решили не переиспользовать переменную окружения PIP_EXTRA_INDEX_URL - для uv надо задавать UV_EXTRA_INDEX_URL
- в UV_EXTRA_INDEX_URL лушче прописывать `/simple`-индекс, у меня сначала было не так, pip работал, а uv уже нет

Но какая же uv офигенно быстрая. Вот примеры двух наших разных проектов:

1. Внутренняя библиотека (меньше 20 зависимостей)
- pip-tools 4 минуты 7 секунд
- с uv 10 секунд

2. Большой старый монолит на Django (больше 100 зависимостей):
- с pip-tools 18 минут 19 секунд
- с uv 32 секунды (!!!)

В общем я очень доволен результатом и рекомендую как минимум посмотреть на эту тулзу.
Любопытная статья от Lyft о том, как они полуавтоматически апгрейдят python в 1500+ внутренних репозиториях. Было интересно посмотреть, как они подходят к этому, прямо скажем, непростому вопросу. https://eng.lyft.com/python-upgrade-playbook-1479145d52f4
Я думаю, что многие python-разработчики хотя бы раз в жизни слышали про то, что использование встроенного модуля pickle может быть небезопасным. Но кажется далеко не все знают, в чем заключается "небезопасность". Хорошая статья на lwn, где высокоуровнево разбирается то, как работает pickle и приводятся примеры, как с помощью него вам могут сделать больно.
tl;dr - скачивать веса ml-моделек в pickle-формате - плохая идея. Подробнее тут - https://lwn.net/Articles/964392/
Привет!
Сегодня в 14:00 по МСК встретимся в прямом эфире Moscow Python Podcast и обсудим:
🟡релиз ruff 0.3.0
🟡style czar или попытка привести языки к одному стилю
🟡Gemini Pro объявила кеширование «риском безопасности»
🟡Cloudflare запустили поддержку python в cloud-workers
🟡как за год изменилось состояние Web Assembly в Python

➡️Когда: 4 апреля в 14:00 по Москве.
➡️Где: онлайн и в записи по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Frost Ming, автор менеджера пакетов pdm выложил несколько постов про его внутреннее устройство:

- для чего нужен lock-файл, как он устроен у pdm и почему именно так https://frostming.com/en/2024/pdm-lockfile/
- как pdm разрешает зависимости и какие есть стратегии формирования lock-файла https://frostming.com/en/2024/pdm-lock-strategy/

В статье довольно много pdm-специфичных вещей, но думаю почитать будет интересно и тем, кто использует другие менеджеры пакетов, чтобы лучше понять как все устроено "под капотом".

P.S. Автор честно предупреждает, что обе статьи — это автоматический перевод с китайского, но тем не менее читается легко и понятно.
Forwarded from Никита Соболев
всем привет! я очень долго обещал сделать бесплатный курс на ютюбе для всех желающих. и вот я, наконец, начал его делать!

встречайте: https://www.youtube.com/@sobolevn

уникальность формата в том, что я рассматриваю одну узкую тему с трех уровней сложности: junior, middle, senior. так что, контент должен быть интересным для всех уровней Python разработчиков!

обратите внимание, что курс не для тех, кто идет учить питон с нуля. он для тех, кто уже хоть немного знает, как погромировать на питоне.

важные ссылки:
- все материалы курса: https://github.com/sobolevn/the-best-python-course
- мой гитхаб: https://github.com/sobolevn
- поддержать мою работу: https://boosty.to/sobolevn
- вступить в наше новое глобальное сообщество: https://discord.python.ru

пишите в комментах к видео, если узнали что-то новое!
мета информация: https://www.youtube.com/watch?v=SVBPkrs9UFg
первый выпуск: https://www.youtube.com/watch?v=WBKf2Cw_9Pc

буду рад обратной связи!
в ближайших планах:
- починить звук и свет
- избавиться от слова "интересный" в описании примерно всего
- сделать много новых видео по разным темам
Я всегда был сторонником обучения на практических задачах и сам не люблю при изучении новых языков/фреймворков/библиотек решать синтетические задачки. Поэтому мне понравился подход ребят из https://codecrafters.io/ - "напишите Redis, Git или Docker своими руками". Я некоторое время мариновал этот сайт в закладках, но тут во время отпуска решил попробовать.

Как это работает:
- Они разбивают большой проект на небольшие задачки по принципу "давай запустим сервис на порту", "теперь давай напишем простой ping/pong" и так далее
- Каждую небольшую задачку ты коммитишь, и они прогоняют по ней автоматические тесты - если тесты зеленые, то ты молодец 🙂
- Там есть очень базовые объяснения как что работает - типа туториалов "как устроен tcp" или "как работает пакет net в go", но их явно недостаточно, чтобы выполнить задание
- Самое интересное — это возможность посмотреть чужой код, прошедший тесты на каждом шаге - они просто показывают тебе покрашенные дифы и по ним можно разобраться, как именно человек переписал код чтобы решить эту задачу

У меня не было много времени, чтобы с этой штукой поиграться, но я написал базовый redis на python (который я знаю хорошо) и go (который я знаю так себе) и вот какие выводы сделал:
- Мне подход показался очень интересным, я точно буду дальше пользоваться. Пока я не платил им денег, но кажется даже без денег на тех бесплатных проектах, что у них есть, можно себя занять на некоторое время
- Это хорошая игрушка для мидлов и выше. Возможно упорный джуниор сможет разобраться, но в этом случае должен очень классно быть прокачан скилл "у меня ничего не работает, но я буду разбираться до победного"
- Мне очень понравилась фича просмотра чужих диффов - особенно для go, с которым я знаком поверхностно - мне было очень интересно посмотреть на разные подходы к решению одной и той-же задачи и что-то утащить себе в копилочку
- Важно не копировать код у других. Я для себя нашел такой вариант - там, где я разбираюсь (python) - пишу сам и смотрю чужие интересные находки. Там, где я разбираюсь не очень (go) - компилирую свой вариант из разных вариантов переписывая под свое чувство прекрасного

В общем выглядит как годный инструмент для тех, кто не хочет застаиваться и особенно прикольно для того, чтобы поразбираться с чем-то новым.
Вышел ruff 0.4.0. Из интересного - они переписали парсер, который преобразует код в ast (abstract syntax trees). Это увеличит скорость работы ruff дополнительно на 20-40% что звучит здорово. Также новый парсер позволяет улучшить обработку ошибок парсинга, нарпимер сделав ошибки более читаемыми.
Также они добавили свой language server, написанный на rust для интеграции с редакторами кода, которые поддерживают language server protocol (LSP). Предыдущий lang server у них был написан на питоне.
Ну и как обычно много всяких улучшений/исправлений меньшего размера.
Ссылка на анонс https://astral.sh/blog/ruff-v0.4.0
Ссылка на ченджлог https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md#040
Хорошая статья про то, как устроены списки в питоне. Начинается с примера, который выглядит простым и понятным, и потом довольно быстро ныряет в зубодробительные детали сишной реализации list-ов.

Если интересно, как python устроен "под капотом" - очень рекомендую, так как автор явно заморочился, нарисовал много картинок и вообще расписал все очень детально, думаю даже для людей, никогда не писавших на C будет в целом понятно https://codeconfessions.substack.com/p/why-do-python-lists-multiply-oddly
И вдогонку чуть более простой и практически применимый материал. Наверное, большинство сейчас для форматирования строк используют f-строки, и чаще всего это просто f"string {variable}", но на самом деле f-строки позволяют удобно форматировать переменную. Например, мне недавно надо было выводить целое число как трехпозиционную строку, т.е. если в числе меньше трех цифр - подставлять в начало нолики (5 -> "005", 10 -> "010", 123 -> 123).

И сегодня наткнулся на pybites хороший гайд по тому, что f-строки умеют. Если вы всем этим богатством не пользовались - очень рекомендую https://pybit.es/articles/python-f-string-codes-i-use-every-day/
Всем привет! На этой неделе у нас будет 2 выпуска Moscow Python Podcast подряд.

🟢Сегодня, 2 мая в 14:00 МСК, поговорим про новости Python за последний месяц - релиз ruff 0.4.0, сборку CPyhon из исходников, PEP-744 Jit Compilation, студенческие задания в open source и что с ними не так, Ubuntu 24.04 LTS онлайн и в записи по ссылке.

🟢Завтра, 3 мая встретимся с Александром Гончаровым, автором телеграм-канала Блог погромиста. В следующем анонсе расскажу подробности выпуска.
Please open Telegram to view this post
VIEW IN TELEGRAM
Привет, в четверг, 16 мая в 14:00 по МСК встретимся в прямом эфире Moscow Python Podcast с Иваном Кривошеевым, ведущим разработчиком Positive Technologies и обсудим:
🟡идеальную ORM;
🟡проблемы asyncio;
🟡опыт перехода на Rust.

➡️Когда: 16 мая в 14:00 по Москве.
➡️Где: онлайн и в записи по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Я почти весь май проболел и почти не постил в канал и пропустил запись послдених выпусков подкаста, буду исправляться.

В пятницу 7 июня в прямом эфире Moscow Python Podcast в 14:00 (по мск) обсудим новости за май, а именно:
🟡Релиз беты Python 3.13
🟡Django Developers Survey 2023
🟡В Django предложили затащить бекграунд-воркеры
🟡Разработчики ставят себе бекдоры на тестовых собеседованиях

➡️Когда: 7 июня в 14:00 по Москве.
➡️Где: онлайн и в записи по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
В эту пятницу, 12 июля в прямом эфире Moscow Python Podcast в 14:00 (по мск) обсудим новости за июнь:

🟡Должен ли Python использовать календарную нумерацию версий
🟡Релиз NumPy 2.0
🟡Как устроена инфраструктура работы с уязвимостями в Python
🟡Современные практики для разработки на Python

➡️Когда: 12 июля в 14:00 по Москве.
➡️Где: онлайн и в записи по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Сегодня традиционно в первую пятинцу месяца, в 14:00 по МСК встретимся в прямом эфире Moscow Python Podcast и обсудим новости за июль:

🟡утечку токена для полного доступа к GitHub-репозиториям проекта Python
🟡python без GIL можно попробовать теперь и локально
🟡почему Apple начал заворачивать приложения на Python 3.12 в App Store
🟡релиз Polars 1.0
🟡PEP 751 — общий формат для lock-файлов зависимостей

➡️Когда: 2 августа в 14:00 по Москве.
➡️Где: онлайн и в записи по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
Последние три месяца я был сначала занят на работе и не успевал писать новости, а потом поехал в отпуск и вообще старался не подходить к компу. Я немного отдохнул, выдохнул и попробую вернуться к регулярному постингу и начну с того, что разберу отложенные интересные статьи 🙂

Начну с короткой заметки, которая хорошо рассказывает о том, какие UUID бывают и для чего их использовать. Если вы всегда просто используете uuid4 то думаю будет полезно расширить кругозор https://www.ntietz.com/blog/til-uses-for-the-different-uuid-versions/

Я последнее время с интересом смотрю в сторону uuid7 - по нему можно делать сортировку и поэтому он выглядит интересно в качестве id-шника. Из коробки модуль uuid в питоне не поддерживает uuid6, uuid7 и uuid8 (потому что пока они по факту не приняты как часть RFC), но есть либа uuid-utils которая реализует все варианты https://github.com/aminalaee/uuid-utils
Вышла Django 5.1, изменений не сильно много, но из интересного:

- поддержка connection pool-ов для psycopg 3
- миддлварь, которая делает аутентификацию обязательной для всех эндпоинтов (полагаю многие писали подобную миддлварьку для своих проектов)
- новый template tag querystring, который позволяет в шаблоне легко добавить новый/заменить значение существующего параметра url-а, сохранив все остальные параметры
- для работы с сессиями пользователя теперь доступно асинхронные методы
- дропнули совместимость с Postgres 12, MariaDB 10.4 и SQLite ниже 3.31.0

ну и много всего по мелочи, почитать release notes можно здесь https://docs.djangoproject.com/en/5.1/releases/5.1/