Python
Общий опыт: 6 лет
Для меня Python является естественным выбором в случаях, когда решаемая проблема не имеет жёстких требований по быстродействию или в экосистеме есть какая-то зарекомендовавшая себя библиотека, которая может быть использована для решения проблемы.
Web-фреймворки
Из всего многообразия Python web-фреймворков мне довелось поработать с тремя:
-
FastAPI использовался мной при разработке основных микросервисов e-commerce платформы для интеграции с маркетплейсами Ozon, Wilberries, Tmall, Яндекс.Маркет и Goods. Мне понравился FastAPI: из коробки используется нативная типизация во имя runtime валидации ( pydantic ), всесторонняя асинхронность (ASGI) и интеграция с
pytest
, да и заточенность под Dependency Injection позволяет избежать многих проблем с передачей контекста. На данный момент является моим основным выбором для веб-сервисов на Python. -
Django активно использовался для разработки монолитного приложения с различными инструментами для маркетплейсов и интерфейсы конфигурирования испытательного оборудования. На Django отлично делать самостоятельные приложения «со всеми удобствами», но микросервисы у меня на нём получались не очень «микро». Разумеется, REST Framework — наше всё!😄 Жаль только, что Django, похоже, не светит стабильный асинхронный ORM , хотя автор SQLAlchemy как-то обоснованно заметил, что порой от асинхронности больше боли, чем пользы .
-
Flask использовался мной при разработке бэкэнда для системы диагностики (на фронте был задействован React, см. JavaScript ). В связи с последующим открытием для себя FastAPI, Flask я больше особо не использовал и сейчас помню о нём лишь то, что на каждый чих нужно ставить специальный плагин ( SQLAlchemy , HTTPAuth …) и что приложения все разобраны на Blueprint’ы …
ORM и базы данных
В Python я обычно работаю с базами данных через ORM SQLAlchemy и Django , хотя порой хватает и SQLAlchemy Core. Голые SQL-запросы, безусловно, незаменимы при оптимизации производительности в условиях растущих нагрузок на сервис, однако, если сервис действительно испытывает такого рода проблемы, возможно, пришло время пересмотреть выбор Python как языка для его реализации?..
До выхода
SQLAlchemy 1.4
, в которую была официально добавлена поддержка asyncio
через asyncpg
и aiomysql
, также было интересно поэкспериментировать с DB-библиотеками, дружащими с asyncio
, вроде
Tortoise
,
GINO
или
databases
. В настоящий момент, они несколько утратили актуальность.
GraphQL
Это творение Facebook’овской инженерной мысли за последние годы набрало значительную популярность, так что я не мог оставаться в стороне, особенно в свете решения вечной проблемы сопряжения интерфейсов с фронтэндом.
Несмотря на очевидное доминирование JavaScript в этой области, в экосистеме Python также нашлись неплохие библиотеки:
-
Graphene — одна из первых и на данный момент набравшая наибольшую популярность. Попользовавшись ей некоторое время, я пришёл к выводу, что дополнительный слой между GraphQL-схемами и прослойкой DB — так себе идея. Starlette ранее имела встроенную поддержку Graphene, но теперь всё .
-
Ariadne — более молодая, чем Graphene, и исправляющая главный её недостаток: схемы не прописываютя через специальное классы, а парсятся напрямую из файлов с GraphQL-схемами. Я использовал Ariadne вместе со Starlette , работало норм (за исключением
DataLoader
, о котором ниже). -
Strawberry — совсем недавняя, на основе Python’овского ответа структурам . На момент моего ознакомления с ней документация была вся в заглушках, так что трогал бегло. Очень интересно будет попробовать, когда эта 🍓 дозреет.
Самая большая проблема со всеми этими библиотеками — отсутствие механизма кэширования запросов к БД с последующим автоматическим формированием batch-запроса ( DataLoader ). В некотором виде эта идея реализована и для Ariadne, и для Graphene (для Raspberry недавно вроде даже появилось полноценное решение ), но спрягать всё это дело с запросами к базам всё ещё не очень приятно, особенно в условиях постоянно меняющихся GraphQL-схем.
Качество кода
Я стараюсь всё время пользоваться типизацией и контролировать типы статическими анализаторами вроде mypy и Pyright (кстати, последний очень даже неплох и как LSP сервер — попроворнее palantir’овского точно).
Из линтеров я в основном использую flake8 , на pylint в какой-то момент забил. Black и yapf особо не находили поддержки в прошлых коллективах, так что привычки к ним нет.
Ну и поскольку, на мой взгляд, тесты являются обязательным элементом CI, pytest мой бро!😄 (кстати, qutebrowser от того же типа тоже 🔥)
(Data) Science & Machine Learning
Богатая научными библиотеками экосистема Python пришлась очень кстати при проведении исследовательской работы в аспирантуре. Для анализа характеристик устройств, которые я разрабатывал, я зачастую использовал
pandas
(впоследствии также выяснилось, что pandas
неплохо стыкуется и с Keras, который я использовал экспериментов с системами управления БПЛА).
Поскольку по основному образованию я являюсь разработчиком систем автоматического управления, естественно, первое время я разрабатывал системы управления в Matlab. Однако, заметив как неплохо всё получается с pandas
, я решил перевести и расчёт систем управления на Python. Библиотека
python-control
вполне покрывала мои нужды.
В дальнейшем, работая над системами управления БПЛА, у меня была идея сделать адаптивный контроллер на основе машинного обучения с подкреплением, так что я связался с Keras . К сожалению, нейросети оказались неподходящей технологией для такой задачи (подробнее в разделе по САУ ).
Другая работа в области ML проводилась при работе над e-commerce платформой. На этот раз было решено использовать Pytorch , поскольку он хоть и весит гиг, но torchvision хорошо ложился на возникшую задачу, да и наличие нужных предтренированных моделей явно было плюсом. Результат получился положительным, но в какой-то момент проект заморозили.
Иллюстрация
Чтож, я не ожидал испанской инквизиции!
На создание этой иллюстрации у меня ушло больше времени, чем на всё остальное! (не вместе взятое) Изначально, я хотел сделать некий коллаж в духе аппликативных анимаций Терри Гильяма с отсылками к бесподобным «Священному Граалю» и «Житию Брайана» и той куче библиотек, что мне довелось использовать:
Но мне не понравился результат. Точнее то, как он смотрелся в общем контексте. В итоге, я решил, что нужно нечто совершенно иное !😅