Библиотека питониста | Python, Django, Flask
40.5K subscribers
2.78K photos
75 videos
51 files
4.36K links
Все самое полезное для питониста в одном канале.

Список наших каналов: https://t.iss.one/proglibrary/9197

Курс по ML: https://cl

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36
Download Telegram
🔥 Cython и PyPy — реальное спасение производительности Python или маркетинговый хайп

Python часто критикуют за скорость — интерпретатор и глобальная блокировка (GIL) создают узкие места, особенно в вычислительно тяжёлых задачах.

Чтобы решить эти проблемы, появились инструменты:

Cython — позволяет писать части кода на языке, близком к C, компилируется в расширения для Python.
➡️ Может дать значительный прирост скорости, особенно для циклов и численных вычислений. Но требует переписывания части кода и понимания низкоуровневых деталей.

PyPy — альтернативная реализация Python с JIT-компиляцией, которая на лету ускоряет выполнение кода без изменений в исходниках.
➡️ Работает отлично для чистого Python-кода, но может иметь проблемы с совместимостью сторонних C-расширений.

Вопрос в воздухе: действительно ли Cython и PyPy — универсальное решение для ускорения Python, или это просто хайп для узких и редких кейсов?

💬 Многие скажут: зачем заморачиваться с этими костылями, если проще переписать узкие места на нативных библиотеках или просто масштабировать. А переход на Cython или PyPy — это лишь добавление головной боли и сложности поддержки.

Библиотека питониста #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍4
🔥 Знакомьтесь, преподаватель нашего нового курса по ML — Мария Жарова.

В карточках рассказали, чем Мария занимается и какие советы даёт тем, кто хочет расти в IT и Data Science ☝️

А если вы уже поняли, что тянуть нечего, начните свой путь в ML правильно: с реальной практикой, поддержкой ментора и видимым результатом.

👉 Записывайтесь на курс
4👏2😁1
📱 Свежие релизы Python‑пакетов за последние 7 дней

PyPy теперь ещё стабильнее: вышел релиз 7.3.20
Django празднует 20 лет — вспоминаем историю
PEP 734 – Multiple Interpreters in the Stdlib —добавляет поддержку множественных интерпретаторов прямо в стандартную библиотеку.
PEP 792 – Project Status Markers in the Simple Index — позволяет PyPI и другим индексам помечать статус проекта.

📦 Новые и обновлённые Python-библиотеки
uv 0.8.0 — молниеносный менеджер пакетов и проектов для Python, написан на Rust
TorchAO 0.12.0 — применение accuracy-oriented оптимизаций к PyTorch-моделям
Firebase Admin SDK 7.0.0 — управляйте Firebase прямо из Python
coredis 5.0.0 — асинхронный Redis-клиент на Python с высокой производительностью
Streamlit 1.47.0 — быстрый способ создать data apps прямо в Jupyter-стиле
dag-factory 0.23.0 — генерация DAGов Airflow на лету из YAML
kedro-datasets 8.0.0 — коннекторы для чтения/записи данных в Kedro
cyclonedx-python 7.0.0 — генерация SBOM (Software Bill of Materials) для Python
textual 4.0.0 — современные TUI-приложения (интерфейс в терминале, но красиво)
opentelemetry-python 1.35.0 — набор API и SDK для телеметрии в Python

🔥 Опыт других
CPython — бессмертные Immortal объекты
Анатомия тестового проекта на Python: раскладываем всё по полочкам для новичков
Bash vs Python: битва, где нет проигравших
PEP-734: Субинтерпретаторы в Python 3.14
Запускаем несколько интерпретаторов в коде на Python — невероятная скорость
Почему Python стал языком нейросетей и как это работает на практике

Библиотека питониста #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥4👍3
😱 Неожиданные фишки Python, которые точно удивят

Python — удобный и мощный язык, но иногда даже простые кусочки кода работают не так, как ожидаешь. В этом проекте опытные питонисты собрали такие примеры, чтобы помочь понять, что происходит «под капотом».

Если вы опытный программист — попробуйте угадать результат с первого раза! Если нет — отличный шанс узнать что-то новое и взглянуть на Python по-новому.

Начнем с самого простого:
a = "wtf"
b = "wtf"
print(a is b) # Что выведет?

a = "wtf!"
b = "wtf!"
print(a is b) # А здесь?


👉 Ссылка на код: https://clc.to/iJUyPg

Библиотека питониста #свежак
7👍5🔥3🤔2
🔥 Вы ещё можете застать старый добрый Proglib — с вечным доступом к курсам.

С 1 августа всё меняется: навсегда — останутся только те, кто успел купить сейчас.

-40% на все курсы. Включая обновлённый Python (кроме курса по AI-агентам)

Это не просто распродажа. Это — последняя точка входа в Proglib Academy по старым правилам.

📚 Выбрать и забрать свой курс навсегда → https://clc.to/TBtqYA
👍1
💼 Топ-вакансий для питонистов за неделю

Middle+/Senior NLP/LLM Engineer —‍ от 4000 до 4500 $, гибрид (Москва)

Python developer —‍ до 280 000 ₽, гибрид (Москва)

Junior Python Developer —‍ от 70 000 до 110 000 ₽, удалёнка

Software Developer Python —‍ от 80 000 до 250 000 ₽, удалёнка

Senior Python AQA Engineer —‍ от 3 000 $, удалёнка

➡️ Еще больше топовых вакансий — в нашем канале Python jobs

Библиотека питониста
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4👾21👍1🌚1
➡️ Как правильно логировать необработанные исключения в Python

При разработке приложений на Python часто используют print для отладки и вывода сообщений. Но в реальных проектах (особенно в продакшене) так делать нельзя — вместо этого используют модуль logging, который позволяет писать структурированные логи в файлы или системы агрегации логов.

🤔 Но есть «подводный камень».

Рассмотрим простой пример: у нас есть функция, которая делит два числа. Если происходит деление на ноль — приложение падает с ошибкой ZeroDivisionError:
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

handler = logging.FileHandler("app.log")
formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

def divide(a, b):
return a / b

def main():
logger.info("Application start")
a = 10
b = 0
logger.info(divide(a, b))
logger.info("Application end")

if __name__ == "__main__":
main()


При запуске мы видим ошибку в консоли, но в логе — только сообщение о старте приложения:
2025-07-14 22:20:04,551 __main__ INFO Application start


Если приложение работает локально — это не страшно, мы видим трассировку ошибки в консоли.

🟠Но что если это продакшен-сервис, который отправляет логи в централизованную систему, а разработчики не имеют доступа к консоли? Тогда при падении приложения мы не увидим, что произошло — логи просто обрываются.

🔰 Решение — sys.excepthook

В Python есть специальный механизм — функция sys.excepthook, которая вызывается при необработанных исключениях. Можно переопределить её, чтобы логировать полную информацию об ошибке, включая стек вызовов.

Добавим в код обработчик:
import logging
import sys

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

handler = logging.FileHandler("app.log")
formatter = logging.Formatter("%(asctime)s %(name)s %(levelname)s %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)

def handle_uncaught_exception(exc_type, exc_value, exc_traceback):
logger.critical(
"Uncaught exception, application will terminate.",
exc_info=(exc_type, exc_value, exc_traceback),
)

sys.excepthook = handle_uncaught_exception

def divide(a, b):
return a / b

def main():
logger.info("Application start")
a = 10
b = 0
logger.info(divide(a, b))
logger.info("Application end")

if __name__ == "__main__":
main()


Теперь, при возникновении исключения ZeroDivisionError, в app.log запишется подробный лог с трассировкой ошибки:
2025-07-14 22:30:44,061 __main__ INFO Application start
2025-07-14 22:30:44,061 __main__ CRITICAL Uncaught exception, application will terminate.
Traceback (most recent call last):
File "/home/andy/main.py", line 31, in <module>
main()
File "/home/andy/main.py", line 27, in main
logger.info(divide(a, b))
File "/home/andy/main.py", line 21, in divide
return a / b
ZeroDivisionError: division by zero


🟠Почему не просто обернуть всё в try-except:
— Оборачивать весь код в глобальный try-except — плохая практика. Это может скрыть настоящие ошибки и усложнить отладку.
sys.excepthook работает централизованно и не мешает локальной обработке ошибок там, где это нужно.
— Этот способ ловит именно непредвиденные ошибки, которые не были перехвачены в коде.

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥86👍5🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
🕸 desto — веб-интерфейс для запуска и управления bash/Python скриптами в фоне

desto — это удобная панель управления, которая позволяет запускать, отслеживать и управлять вашими bash и Python скриптами прямо из браузера. Всё работает поверх tmux, без лишней возни.

Возможности:
Запуск и остановка tmux-сессий в один клик
Поддержка .sh и .py файлов
Управление скриптами: создание, редактирование, сохранение, удаление
Просмотр логов в реальном времени
Мониторинг ресурсов: CPU, память, диск
Планирование запуска скриптов и цепочек скриптов
Хранение истории сессий (через Redis)
Управление запланированными задачами
Постоянное хранение скриптов и логов в отдельных папках
CLI-интерфейс для управления с терминала

Установка:
pip install desto


🔎Ссылка на GitHub: https://clc.to/RCZ4ow

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍2🔥2
🔥 Хороший ML-разработчик не начинает с нейросетей

На собеседовании по ML System Design кандидату дают задачу «предсказать отток», а он сразу лезет в нейросети. Красиво, модно, дорого.

Но профи думает иначе:

💭 Логрегрессия? Градиентный бустинг?
💭 А сколько у нас данных и времени?
💭 Что с интерпретируемостью?

Потому что не выбрать адекватную модель — это уже ошибка.

Нейросети — это круто. Но без понимания классического ML вы просто «подключаете модельку», а не строите решения.

➡️ На курсе разберём:

— линейные модели, деревья, PCA, кластеризацию
— метрики, переобучение, bias vs variance
— инженерные подводные камни, которые идут сразу после fit()

🎁 Скидка 10 000₽ по промокоду Earlybird, только до 27 июля.

А ещё — подарок для первых 10 участников: специальный лонгрид по теме курса, чтобы вы могли начать погружение в материал уже сегодня.

🔗 Успей записаться — и начни карьеру в Data Science уже через 3 месяца!
2
🎞 Что посмотреть: практические советы для локальной разработки на Python с uv

В новом видео показывают, как выстроить бысткие и предсказуемые локальные Python-процессы с помощью uv — современного инструмента для управления зависимостями.

Разбираются конкретные техники, которые делают работу над проектами стабильнее и удобнее:
— управление зависимостями без лишней магии
— автоматизация повседневных задач
— упрощение локальной разработки в команде

Также показывают, как uv можно сочетать с:
📌 Just — таск-раннер
📌 Overmind — управление множеством процессов
📌 Direnv — автозагрузка переменных окружения

Подход делает локальную разработку не только быстрее, но и скучнее в хорошем смысле — без сюрпризов, хаоса и «а у меня не работает».

🔗 Ссылка на видео: https://clc.to/2mdH7g

Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥53
📦 Распаковка * и ** прямо в генераторах

Это предложение в Python (PEP 798), которое добавляет возможность использовать распаковку (* и **) прямо в списковых, множественных и словарных генераторах и выражениях.

➡️ Часто нужно объединить много списков, множеств или словарей в один — сейчас для этого приходится писать вложенные циклы или использовать сложные конструкции. Новый синтаксис делает это проще и понятнее.

Допустим, есть список списков:
its = [[1, 2], [3, 4], [5]]


Как сейчас объединить их в один список:
flattened = [x for it in its for x in it]


С новым синтаксисом можно просто написать:
flattened = [*it for it in its]


Это автоматически распакует все элементы из вложенных списков в один.

То же самое работает для множеств и словарей:
sets = [{1, 2}, {2, 3}]
combined_set = {*s for s in sets} # объединение всех множеств

dicts = [{'a': 1}, {'b': 2}]
combined_dict = {**d for d in dicts} # объединение словарей


И для генераторов тоже:
gen = (*it for it in its)


👇 А как вы обычно объединяете несколько списков или словарей?

Библиотека питониста #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥86
🌸 Команда дня: научите свои объекты быть честными

В Python поведение объектов в if-ах — это не магия, а продуманный дизайн.

➡️ По умолчанию любой объект считается «истинным», если вы не скажете иначе.

Когда вы пишете:
if obj:
...


Интерпретатор Python делает следующее:
1️⃣ Вызывается some_object.__bool__(), если метод определён.
2️⃣ Если bool не определён — вызывается some_object.__len__().
➡️ Если длина равна 0 — объект считается False.
➡️ Иначе — True.
3️⃣ Если не определён ни __bool__(), ни __len__() — объект считается True по умолчанию.

Хотите, чтобы объект вёл себя как True или False — определите метод __bool__() или хотя бы __len__():
class Scroll:
def __init__(self, text):
self.text = text

def __bool__(self):
return bool(self.text.strip())


Теперь:
bool(Scroll("Мир"))      # True  
bool(Scroll(" ")) # False


А если это контейнер — можно просто __len__():
class WisdomBasket:
def __init__(self):
self.sayings = []

def __len__(self):
return len(self.sayings)


➡️ Зачем это всё

Потому что if obj: — это не просто проверка, а сообщение:
«Если объект значим…»

И вы решаете, что значит «значим».

Например, что вы хотите сказать, когда пишете:
if response:


Означает ли это:
— что запрос прошёл успешно?
— что в теле ответа есть данные?
— что статус 200?

Это решаете вы, определяя bool.

Но не переусердствуйте: если логика неочевидна, лучше писать явно:
if config.is_valid():


чем
if config:  # что это значит?


Библиотека питониста #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11👏32