#python python... PYTHON 🔛 🚀
11 subscribers
914 photos
7 videos
158 files
1.54K links
Download Telegram
Forwarded from Zen of Python
Список лучших библиотек на Python за 2022

В этот раз в подборку попало больше библиотек по ИИ и науке о данных, но всё равно в списке вы найдёте интересные ресурсы, которые стали популярны в этом году и не связаны с наукой:

https://habr.com/ru/post/707916/

#библиотека
Forwarded from Zen of Python
Вопросы и ответы к интервью для Python Developer

Годный репозиторий, в котором собраны популярные вопросы по Python и смежным темам: Django, ООП, принципы программирования, HTML, фронтенд и БД.

Сохраните, чтобы не потерять: https://github.com/yakimka/python_interview_questions
Forwarded from Stanislav Bashkyrtsev
Проблема питона - не скорость.. Со скоростью в большинстве сервисов можно смириться. Проблема в том что все плохо продумано, коммьюнити очень слабое - все инструменты через одно место.

- Система загрузки модулей.. Не позволяет сказать "хочу этот модуль, а тот не хочу". Все что есть в репозитории модулей (site-packages) доступно, ну и соответственно нет возможности несколько версий одной библиотеки иметь (для разных приложений). За сим имеем кучу инструментов (pyenv, venv, virtualenv, etc) которые "решают" эту проблему страшными хаками типа "а давайте для этого проекта создадим его виртуальное окружение с его копией питона, файлами которые переопределяют стандартные питон модули, и так изолируем его зависимости"
- Инструменты сборки постоянно меняются, существует несколько инструментов по скачиванию зависимостей. И представляете - опубликованную версию зависимости можно удалить из центральной репы! У меня такое было лет 10 назад с mysql драйвером. Вот это я удивился..
- Нет ничего на подобие Spring IoC + Spring MVC. Т.е. нет возможности написать веб приложение с Dependency Injection'ом. Я счас просто свой IoC сделал в проекте. Что в целом не мешает, однако он же никак с MVC не интегрируются. Вроде как FastAPI обещал сделать Dependency Injection, а на самом деле сделал вообще не его. Но при этом сказал что это DI 😵 Т.е. вы не можете описать любые singleton бины и их заинжектить - он просто дергает метод, который каждый раз создает новые объекты (и вроде все равно не каждый объект можно так создать).
- Логирование.. казалось бы что может тут пойти не так. Но пришлось 2 дня разбираться как его настроить. 99% примеров в интернетах создают свою глобальную функцию по созданию логера, чтоб его централизованно так настраивать. Это вместо того чтоб использовать файл настроек.. Дикость. Ну и соответственно ни один фреймворк/библиотека ничего норм не логируют. А потому что не понимают как..
- Библиотеки и фреймворки все как один плохо спроектированы. Возьмем нормальные платформы типа Java - есть либа для JSON (де)сериализации (например, Jackson), есть библиотека для валидации входящих данных (Bean Validation), есть для считывания свойств (Spring IoC). А в питоне? Там есть популярный Pydantic, который реализует все три штуки вместе! Как можно было придумать запихнуть три несвязанные друг с другом responsibilities в одну либу - в голову не приходит.
И ладно бы одна такая либа, но нет же.. SQLalchemy - это JOOQ и ORM в одном теле. При этом есть либа для миграции БД - и она зависит от SQLalchemy! Тут душа требует много восклицательных знаков. Ну вы представляете если бы Flyway зависил от JOOQ или Hibernate? И реально нет в питоне нормального инструмента по миграциям (я не нашел во всяком случае) - только недоделанный yoyo
- Отсутствие интерфейсов
- Нет строгого JDBC - есть только DB-API который кой-как описан. Но если хотите - можете не следовать (и есть много драйверов которые этого не делают!). Ну и соответственно нет универсальных DB Pool типа c3p0. Представляете - у постргреса в самом драйвере написан свой DB Pool 😵

Ой, я могу продолжать конечно, но надо бы и поработать 🙂
Forwarded from Stanislav Bashkyrtsev
#python python... PYTHON 🔛 🚀
Хорошо написал, согласен. Хочу уточнить про di в фастапи, что конкретно не устраивает?
В понимании энтерпрайз/веб разработчика Dependency Injection - это фабрика, которая инициализирует объекты нашего приложения, проставляя им всем зависимости. Т.е. есть у нас какой-то Repository и Service. Сервису нужен объект Репозитория, но мы не хотим его создавать прям внутри Сервиса. Потому как а) для создания Репозитория нужны свои зависимости (DataSource, JdbcTemplate, etc) и б) этот же репозиторий нужен будет еще каким-то Сервисам. Поэтому мы создаем один Репозиторий на все приложение (это делает наша Фабрика), и пропихивает его всем Сервисам и кому там еще он нужен. Всё - все объекты проинициализированы и весь код готов к работе.

В FastAPI то что они называют Dependency Injection - эт совсем другое. Это просто функция, которую сам FastAPI вызовет прежде чем вызывать метод API. И вернувшееся значение будет передано уже в целевой метод API:


def create_dog_from_params(self, some_http_param):
return Dog.from_http(some_http_param)

@router.put(path="/dog")
def get_dog(dog=Depends(create_dog_from_params)):
dog_service.save(dog)

Т.е. это было бы аналогично такому коду:


@router.put(path="/dog")
def get_dog(some_http_param):
dog = create_dog_from_params(some_http_param)
dog_service.save(dog)


И это они назвали Dependency Injection.. И у них есть набор пред-определенных объектов которые они сами могут таким же механизмом пробросить в метод. Например, ту же Session из SQLalchemy 🤦

В общем относительно бесполезный механизм. А DI как не было, так и нет - значит все Сервисы/Репозитории/DataSource'ы нужно инициализировать какими-то синглтонами/фабриками.
Forwarded from Stanislav Bashkyrtsev
Что мы в Java привыкли иметь в плане логирования:
1. Каждый класс создает свой логер. Значит мы можем выборочно поднять/уменьшить уровень логирования.
2. Каждый логгер называется по названию класса. Значит легко найти место откуда логи идут, а оттуда уже и логику которая решила сделать что-то неверное.
3. Конфигурация происходит файлом, декларативно. Никак не в коде. Наше приложение определяет настройки логирования, не библиотека.
4. Это простой инструмент. Легко понять, легко настроить уровень логирования.

Что имеем в питоне:
1. Часто библиотеки создают один логгер на все. Соответственно если захотели поднять уровень, то прийдется включить все логи библиотеки на этом уровне.
2. Как доп недостаток - сложней найти кусок кода который решил что-то залогировать (это решаемо дебагом, но все равно дольше)
3. 99% статей и проектов которые находим в интернете используют код для настройки логирования. Это значит что все что начало логировать пока не дошли до нашей главной инициализации логов (нам нужно явно указать файл настроек) - логирует по-своему. И только когда наш код это изменил - пошли нормальные логи. Интересно, что тот же FastAPI вообще не позволяет ничего настроить по-своему - он создает свой LoggingManager и наши изменения на него никак не влияют. Это то же что сказать что в Java проекте нельзя перенастроить логирование для Томката или Spring MVC..
4. Я постоянно стреляю себе в ногу этим логгером. Вот какую-то мелочь забыл - и все, ниче не логируется или логируется неверно. Казалось бы, это же просто логгер.. Зачем-то у handler'ов (appender'ов если переводить на log4j) есть свой уровень логирования; есть child-parent отношения между логгерами и по умолчанию сообщения будут дублироваться; в конфиге логер сначала нужно объявить, а потом еще и описать (размазываем конфигурацию по двум местам); у логгера зачем-то есть обязательное *логическое* имя. В общем можно было бы это проще реализовать.

Технически с этим всем можно один раз посидеть и разобраться. Но само комьюнити этого не делает - я еще не видел ни одного проекта где логирование было бы хорошо сделано.

Еще я пока не нашел как в него пробрасывать thread-local переменные. В Java логгерах это называется MDC (Mapped Diagnostic Context). Это удобно для того чтоб, к примеру, ассоциировать логи с пользователем. В начале обработки запроса мы устанавливаем его username в MDC, а в конце - убираем. И все логируемые строки пишут username (ну или что там еще кому интересно). *Вроде* в Питоне это должно получится сделать через User-defined objects, но еще не пробовал.

---
Справедливости ради, в той же Java логирование тоже плохо сделано. Стандартным логгером никто не пользуется (хотя не понятно почему - проблемы с classloader memory leak'ом вроде бы решены, но может стигма осталась..), все используют внешние библиотеки. Но их несколько: log4j (а теперь еще и 2.x), logback, commons-logging, jboss-logging, ну и Томкат использует все-таки стандартный. Каждая библиотека использует то что ей нравится. Соответственно в любом проекте нужно настроить не только сам логгер, но еще и несколько переходников чтоб все эти вызовы к нему перенаправлялись. Это жутко все усложняет.

Но зато само комьюнити привыкло хорошо логировать - это большой плюс.
Forwarded from Zen of Python
Вопросы и ответы к интервью для Python Developer

Годный репозиторий, в котором собраны популярные вопросы по Python и смежным темам: Django, ООП, принципы программирования, HTML, фронтенд и БД.

Сохраните, чтобы не потерять: https://github.com/yakimka/python_interview_questions
This media is not supported in your browser
VIEW IN TELEGRAM
Для тех кто любит программировать на Python и не любит Javascript не могу не рассказать о таком проекте как PyScript [1], код для исполнения кода Python'а на стороне браузера. Включает как простые, так и сложные примеры [2], а также по нему есть огромное руководство с кучей подробностей [3].

Признаюсь, я лично, никогда не любил разработку фронтэнда именно из-за Javascript'а, какое-то сильное чувство отторжение у меня вызывало его использование, так что не только Javascript'у проникать на сервер, но и Python'у в браузер.

А их свежего и любопытного - руководство по написанию расширений для Google Chrome с помощью PyScript [4].

Почему это важно? Многие продукты по обработке и визуализации данных не сервере написаны на Python. Если PyScript будет работать с хорошей производительностью, то часть задач обработки можно будет перенести в браузер и поддерживать единую кодовую базу.

Пока единственное ограничение в том что PyScript более-менее оттестирован в Chrome, но даже в Firefox'е его активно не проверяли.

Тем не менее, экспериментировать можно уже сейчас.

Ссылки:
[1]
https://pyscript.net
[2]
https://pyscript.net/examples/
[3]
https://realpython.com/pyscript-python-in-browser/#modules-missing-from-the-python-standard-library
[4]
https://medium.com/@petefison/write-chrome-extensions-in-python-6c6b0e2e1573

#opensource #python #programming
Источник: https://t.me/begtin/4404
Forwarded from [PYTHON:TODAY]
💾 Огромная, структурированная шпаргалка по Python

🌵 Всё, от базовых типов, словарей, списков и т.д включая копируемые примеры кода с функциями и результатом выполнения
🌵 Работа с файлами и путями
🌵 Регулярные выражения
🌵 Debugging/Отладка
🌵 Виртуальные окружения
🌵 Функции и классы и много других интересных вещей

В общим маст хэв 👍

#doc #python #cheatsheet
Forwarded from Блог о Data Science 💻 (Red Powerful)
🔤🔤🔤🔤🔤🔤🔤🔤

Удалите Anaconda с вашего PC! 🔒

В чате Karpov Courses, где я являюсь одним из модератором часто сталкиваюсь с людьми у которых какие то проблемы с Anaconda, в основном они связаны с тем какими то библиотеками, неправильной установкой зависимостей и тп.

Как правило все эти юзеры - только только вкатываются в профессию и не умеют работать с виртуальным окружением. А в дальнейшем, когда они будут работать с прод кодом, они осознают, что постоянно переносить из одного окружения в другой - гемор, тем более в окружение анаконды. Давайте разбираться! 👨‍💻

Начнем с того, зачем вы пишите код?

🐍 Что бы быстро что-то исследовать без дальнейшего его использования.
В каком случае удобно использовать Jupyter Notebook - Когда можно быстро накидать какой-то код или вы делаете какое то исследования, аналитику (без дальнейшего использования этого кода). Однако мы все так же должны соблюдать pep8, R&R, писать код в скриптах и использовать как можно меньше локальных переменных.

🐍 Когда этот код будут использовать в проде.
Тогда лучше сразу писать в .py просто потому что когда вы будете переносить с юпитера, вероятнее всего вы будете сталкиваться с багами хранения глобальных перменных. А во вторых тестирования, валидации и запуск полного пайплайна. Что реализовывать в юпитере достаточно сложно. (Если вы не работаете в Netflix или не поехавший)

Что такое виртуальное окружение?
У вас есть глобальный Python, а теперь представьте что у вас 5 проектов, каждый из которых использует разные зависимости или версии этих зависимостей. Пока вы будете чинить один, у вас будет ломаться другой. Получается некая каша библиотек. Виртуальное окружение - некая независимая оболочка для хранения ваших зависимостей для вашего проекта. (Как правило она называется VENV от слова virtual environment). То есть теперь у вас для каждого проекта будет свое место для хранения библиотек, которые не будут путаться между собой.
Подробнее про виртуальное окружение и его активацию

Какое окружение использовать?
Есть несколько виртуальных окружений
- venv
- virtualenv
- conda (не анаконда)
etc
Я использую virtualenv + pyenv, мне кажется это наиболее удобная комбинация.
Подробнее про виртуальные окружение и как его установить

А как теперь поставить юпитер?
Все просто, активируем наше окружение и пишем
> pip install jupyter notebook
или
> pip install jupyterlab

Ого юпитер разве не привязан к анаконде?
Да, jupyter можно поставить отдельно и запускать его командой в bash (При активированном окружении)
> jupyter notebook
> jupyter-notebook
> jupyterlab

Best Practice:
Если вы хотите быстро сделать какой то draft - сделайте это в google colab!
Please open Telegram to view this post
VIEW IN TELEGRAM
🖥⌨️ Подключаемся по SSH к удаленному компьютеру или серверу (прямо из Python)

#python
🕰📅 Модуль pytz

Модуль pytz обслуживает функции преобразования даты и времени. Таким образом, позволяет пользователям обслуживать международную клиентскую базу.

В примере выше мы узнаем дату и время конкретного часового пояса.

С документацией пакета вы можете ознакомиться здесь.
#python
🦕👨‍💻 Автоматизация тестирования с PyTest

В курсе автоматизации тестирования, мы будем создавать проект с нуля используя самые популярные технологии на данный момент для автоматизации на Python.

Создадим, добавим тесты, оптимизируем, напишем валидации, научимся отправлять реквесты, упаковывать в Docker и генерировать красивый allure report.

📺 Просмотр
#python
🧾🕵🏻‍♂️ Распознавание текста на изображениях

C помощью Python обёртки над программой OCR tesseract.

Саму программу можно установить отсюда:
https://github.com/tesseract-ocr/tesseract
#python
🦖🦆 Полиморфизм в Python: утиная типизация (ducktyping)

💬 Полиморфизм. Как обычно нас будет интересовать, что это такое и зачем это нужно программисту.

📌 Если не вдаваться в теории, то полиморфизм о котором вам нужно знать и о котором спросят на собеседовании - это механизм, позволяющий выполнять один и тот же код по-разному.

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

📺 https://www.youtube.com/watch?v=MwsIOSZAkN8
#python