#python python... PYTHON 🔛 🚀
11 subscribers
912 photos
7 videos
158 files
1.54K links
Download Telegram
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
🦖♐️ Парсинг и скрейпинг сайтов Python - теоретический минимум

Веб-скрейпинг (Парсинг) Python Selenium. Как парсить сайт Питон и Селениум?

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

📺 Просмотр
#python
🔭🩻 Создаем веб-сканер страниц

💬 Рассмотрим поэтапный процесс создания веб-сканера для отслеживания изменений и последующего оповещения посредством e-mail. Работаем с Python, Beautiful Soup и Pipedream.

📌 В этом обучающем руководстве мы научимся отслеживать изменения страниц с помощью такой библиотеки Python, как Beautiful Soup. Кроме того, узнаем, как бесплатно отправить e-mail посредством Pipedream, превосходной платформы low-code для интеграции API.

👆🏻Читать статью
#python
Написание быстрых асинхронных HTTP-запросов с Python
О
том, как прокачать скорость HTTP-запросов, можно узнать здесь.

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

👆🏻Читать
#python