Библиотека Python разработчика | Книги по питону – Telegram
Библиотека Python разработчика | Книги по питону
18.8K subscribers
1.06K photos
403 videos
82 files
1.08K links
Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍

По всем вопросам @evgenycarter

РКН clck.ru/3Ko7Hq
Download Telegram
⚡️ Готовые решения и лучшие практики для надёжной защиты API в архитектуре бэкенда

📅 26 января | 20:00 мск | бесплатно

Хотите, чтобы ваши API были надёжно защищены без потери производительности?

На вебинаре разберём:

- Типовые угрозы и уязвимости API в современных backend-системах

- Аутентификация и авторизация: лучшие подходы, паттерны и типичные ошибки

- Защита на уровне архитектуры: rate limiting, throttling, контроль доступа

- Роль API Gateway и прокси в обеспечении безопасности

- Лучшие практики проектирования защищённых API и контрактов

💡 Полезно для:

- Software Architects, проектирующих внешние и внутренние API

- Backend-разработчиков, работающих с интерфейсами

- Технических лидов, отвечающих за безопасность и устойчивость систем

После вебинара вы сможете:

- Проектировать API с учётом безопасности на уровне архитектуры

- Выбирать и применять готовые решения для защиты API

- Использовать чек-лист лучших практик для создания защищённых интерфейсов

- Осознанно балансировать между безопасностью, сложностью и производительностью

👉 Регистрируйтесь https://vk.cc/cTDTJV

Занятие приурочено к старту курса "Software Architect", обучение на котором позволит освоить компетенции архитектора по моделированию и построению отказоустойчивых, масштабируемых и безопасных информационных систем.
Как ускорить код на Python? Используем map, filter, reduce

Привет, друзья! Сегодня расскажу о том, как можно ускорить выполнение кода, заменяя обычные циклы на встроенные функции map(), filter() и reduce(). Эти инструменты позволяют писать более компактный, читаемый и быстрый код.

map()
Функция map() применяется к каждому элементу последовательности и возвращает новый итератор.

Обычный способ:

numbers = [1, 2, 3, 4, 5]
squared = []
for num in numbers:
squared.append(num ** 2)


Быстрее с map():

numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))

За счёт того, что map() использует C-оптимизированную логику, код выполняется быстрее.

filter()
Фильтрует элементы последовательности по заданному условию.

Медленный вариант:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = []
for num in numbers:
if num % 2 == 0:
evens.append(num)


Быстрее с filter():

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = list(filter(lambda x: x % 2 == 0, numbers))

Такой код читается легче и работает быстрее.

reduce()
Позволяет выполнять кумулятивные операции (например, суммирование, умножение).

Классический способ:

numbers = [1, 2, 3, 4, 5]
product = 1
for num in numbers:
product *= num


Быстрее с reduce():

from functools import reduce

numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)

Этот метод полезен, если нужно свести список к одному значению.

💡 Важно: reduce() чаще заменяют sum() или math.prod(), но для сложных операций он остаётся полезным.


Такие функции помогают писать код, который не только быстрее работает, но и легче читается.

📲 Мы в MAX

👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
Pytest Patterns: Элегантный Teardown через yield и оптимизация скоупов

Если вы все еще пишете def teardown_method(self): в классах тестов, вы не используете мощь Pytest на 100%.
Фикстуры (fixtures) - это не просто способ передать данные. Это полноценный механизм управления жизненным циклом зависимостей (DI).

1. yield вместо return: Встроенный Teardown
В Pytest фикстура может "замереть", отдать управление тесту, а потом продолжить выполнение. Это реализуется через генератор yield.

Код до yield - это setUp.
Код после yield - это tearDown.

Пример (временная база данных):


import pytest
from sqlalchemy import create_engine

@pytest.fixture
def db_engine():
# Setup: Поднимаем соединение
engine = create_engine("sqlite:///:memory:")

# Передаем объект в тест
yield engine

# Teardown: Этот код выполнится ПОСЛЕ завершения теста
# (даже если тест упал с ошибкой!)
engine.dispose()



Это гарантирует, что ресурсы будут освобождены, и вам не нужны try/finally блоки внутри самих тестов.

2. Scopes: Не создавайте мир заново
По умолчанию фикстура имеет scope='function'. Она создается и умирает для каждого теста. Это безопасно, но медленно, если мы говорим о поднятии Docker-контейнера или коннекта к БД.

Используйте scope='session' для тяжелых ресурсов, которые можно переиспользовать.

Паттерн "Изоляция при общем ресурсе":
Частая задача Middle+: иметь одну БД на весь прогон тестов (быстро), но чистые таблицы для каждого теста (изолированно).

Решение: комбинируем скоупы.


# Живет весь прогон тестов (создается 1 раз)
@pytest.fixture(scope="session")
def db_engine():
engine = create_engine(...)
yield engine
engine.dispose()

# Живет 1 тест (создается N раз)
@pytest.fixture(scope="function")
def db_session(db_engine):
# Берем engine из сессионной фикстуры
connection = db_engine.connect()
transaction = connection.begin() # Начали транзакцию

session = Session(bind=connection)
yield session

session.close()
# ROLLBACK транзакции после теста вернет базу в исходное состояние!
transaction.rollback()
connection.close()



Итог:

🟢Используйте yield для очистки ресурсов.
🟢Тяжелые объекты (Engine, Client, Container) - в scope='session'.
🟢Легкие объекты с состоянием (Session, User) - в scope='function', наследуясь от тяжелых.

#pytest #testing #qa #bestpractices #python

📲 Мы в MAX

👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
Одной из самых непоследовательных частей синтаксиса Python являются литералы кортежей.

По сути, чтобы создать кортеж, вы просто пишете значения, разделенные запятыми: 1, 2, 3. Пока что все понятно. А как насчет кортежа, содержащего только один элемент? Вы просто добавляете завершающую запятую к единственному значению: 1,. Это выглядит несколько некрасиво и может быть подвержено ошибкам, но логика понятна.

А как насчет пустого кортежа? Это просто запятая? Нет, это (). Значит ли это, что круглые скобки создают кортеж так же, как и запятые? Нет, это не так. (4) — это не кортеж, это просто 4.

Пример:

a = [
(1, 2, 3),
(1, 2),
(1),
(),
]

[type(x) for x in a]
# Результат: [tuple, tuple, int, tuple]


Чтобы все стало еще более запутанным, литералы кортежей часто требуют дополнительных круглых скобок. Если вы хотите, чтобы кортеж был единственным аргументом функции, то f(1, 2, 3) не сработает по очевидной причине — вместо этого нужно написать f((1, 2, 3)).

📲 Мы в MAX

👉@BookPython
👎4👍32
🎥 Открытый урок «Подключение OpenAPI Swagger к Django-REST-Framework».

🗓 04 февраля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса
«Django-разработчик».

Хорошее API — это не только код, но и понятная документация. Без неё REST-сервис быстро превращается в чёрный ящик для команды и клиентов.


Что будет на вебинаре:
✔️ Интеграция библиотеки drf-spectacular для генерации схемы OpenAPI 3.0.
✔️ Кастомизация документации: использование декоратора @extend_schema и типизации.
✔️ Подключение и настройка интерфейсов Swagger UI и Redoc.

В результате вебинара вы получите:
- Навык быстрой настройки автодокументации в существующих проектах.
- Умение описывать сложные параметры запросов и ответов.
- Готовый интерактивный интерфейс для тестирования API внутри браузера.

🔗 Ссылка на регистрацию: https://vk.cc/cTPi2Z

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ранее мы затронули типизацию в фикстурах (косвенно), поэтому сегодня поговорим про:

Protocol vs ABC: Утиная типизация на стероидах (Static Duck Typing)

В классическом ООП (Java, C#) и при использовании abc.ABC в Python мы привыкли к Nominal Subtyping (Именная подтипизация). Чтобы объект считался Bird, он должен явно наследоваться от Bird.
Это создает жесткую связность (coupling): ваша реализация должна знать об интерфейсе и импортировать его.

С приходом typing.Protocol (Python 3.8+) мы получили Structural Subtyping (Структурная подтипизация).

В чем суть?
Если класс имеет метод quack(), то это Утка. Неважно, от чего он наследуется. Это и есть та самая «утиная типизация», но теперь поддерживаемая статическим анализатором (mypy, pyright, IDE).

Сравним код:

Старый путь (ABC):


from abc import ABC, abstractmethod

# 1. Жестко определяем интерфейс
class SenderABC(ABC):
@abstractmethod
def send(self, msg: str) -> None: pass

# 2. Обязаны наследоваться!
class EmailService(SenderABC):
def send(self, msg: str) -> None:
print(f"Email: {msg}")

def alert(sender: SenderABC):
sender.send("Alert!")



Новый путь (Protocol):


from typing import Protocol

# 1. Описываем, "что мы ждем от объекта"
class SenderProto(Protocol):
def send(self, msg: str) -> None: ...

# 2. Реализация НИЧЕГО не знает про Protocol
# Никаких импортов и наследования!
class SmsService:
def send(self, msg: str) -> None:
print(f"SMS: {msg}")

# Mypy счастлив: SmsService имеет нужную структуру (метод send)
def alert(sender: SenderProto):
sender.send("Alert!")

alert(SmsService())



Киллер-фича: Retroactive Abstraction (Ретроактивная абстракция)
Представьте, что вы используете стороннюю библиотеку (например, boto3 или клиент Redis). Вы не можете заставить их классы наследоваться от ваших ABC.
С помощью Protocol вы можете создать интерфейс для уже существующего чужого кода, не меняя его, и типизировать свои функции.

Нюансы для Middle+:

1. Runtime: По умолчанию isinstance(obj, MyProtocol) выбросит ошибку. Протоколы - это compile-time фича. Если нужна проверка в рантайме, декорируйте протокол @runtime_checkable.

2. Свойства: В протоколе можно описывать не только методы, но и поля через @property или просто аннотации типов.

Используйте Протоколы, чтобы развязать зависимости между модулями. Это основа принципа Dependency Inversion в Python.

#python #typing #mypy #architecture #clean_code

📲 Мы в MAX

👉@BookPython
👍6
Если у вас есть ресурсоемкая задача для процессора и вы хотите использовать все доступные ядра, то multiprocessing.Pool - это то, что вам нужно. Он создает несколько процессов и автоматически распределяет между ними задачи. Просто создайте пул с Pool(number_of_processes) и выполните p.map с списком входных данных.


import math
from multiprocessing import Pool

inputs = [i ** 2 for i in range(100, 130)]

def f(x):
return len(str(math.factorial(x)))

# Однопоточное выполнение
%timeit [f(x) for x in inputs]
# 1.44 s ± 19.2 ms per loop (...)

# Параллельное выполнение с 4 процессами
p = Pool(4)
%timeit p.map(f, inputs)
# 451 ms ± 34 ms per loop (...)


Также можно не указывать параметр number_of_processes, по умолчанию он равен количеству ядер CPU в системе.

📲 Мы в MAX

👉@BookPython
👍42
10 полезных библиотек для Python-разработчика

Сегодня я подготовил для вас подборку из 10 полезных библиотек, которые могут сделать вашу разработку проще и эффективнее. Поехали! 🚀

1️⃣ Rich – красивый вывод в консоль. Если хотите раскрасить логи, добавить таблицы или анимации – эта библиотека вам пригодится.
📌 pip install rich

2️⃣ Typer – современный способ писать CLI-приложения. Работает на основе аннотаций типов и делает разработку CLI удобнее.
📌 pip install typer

3️⃣ Pendulum – альтернатива datetime, но с удобным API и встроенной поддержкой часовых поясов.
📌 pip install pendulum

4️⃣ HTTPX – асинхронный клиент для работы с HTTP-запросами. Поддерживает async/await, в отличие от requests.
📌 pip install httpx

5️⃣ Pydantic – мощный инструмент для валидации данных и работы с моделями. Особенно полезен в FastAPI.
📌 pip install pydantic

6️⃣ Poetry – современный менеджер зависимостей. Упрощает работу с виртуальными окружениями и пакетами.
📌 pip install poetry

7️⃣ Loguru – удобная альтернатива стандартному logging. Позволяет логировать без лишнего кода.
📌 pip install loguru

8️⃣ FastAPI – один из самых быстрых Python-фреймворков для создания API. Использует аннотации типов и async/await.
📌 pip install fastapi

9️⃣ Tqdm – библиотека для удобных progress-bar'ов в терминале. Незаменима при обработке больших данных.
📌 pip install tqdm

🔟 Black – автоматический форматтер кода, который придерживается строгого стиля. Просто устанавливаешь – и больше не думаешь о стиле кода.
📌 pip install black

📲 Мы в MAX

👉@BookPython
👍41
⚡️ Apache Camel в архитектуре решений бэкенда

📅 4 февраля | 20:00 мск | бесплатно

Хотите строить надёжные и гибкие интеграции между сервисами без лишней сложности?

На вебинаре разберём:

- Роль Apache Camel в современной backend-архитектуре
- Enterprise Integration Patterns и их практическое применение
- Типовые сценарии: синхронные и асинхронные интеграции
- Camel как связующее звено между микросервисами, брокерами сообщений и внешними системами
- Архитектурные преимущества и реальные ограничения использования Apache Camel

После вебинара вы сможете:

- Определять, когда Apache Camel — правильный архитектурный выбор
- Проектировать интеграционные потоки на основе проверенных паттернов
- Строить устойчивые и слабо связанные backend-решения
- Принимать осознанные архитектурные решения в области интеграций

👉 Регистрируйтесь https://vk.cc/cTYHGZ

Занятие приурочено к старту курса "Software Architect", обучение на котором позволит освоить компетенции архитектора по моделированию и построению отказоустойчивых, масштабируемых и хорошо интегрируемых информационных систем. Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍2
🔥 Как ускорить Python-код в 10 раз?

Сегодня покажу вам мощный инструмент для оптимизации кода - Numba. Это библиотека, которая позволяет компилировать Python-функции в машинный код, используя JIT-компилятор.

🚀 Как это работает?

Numba использует LLVM для компиляции кода во время выполнения, превращая Python в код, близкий по скорости к C.

Пример

Допустим, у нас есть функция, вычисляющая сумму квадратов чисел:


import numpy as np
import time

def sum_of_squares(n):
result = 0
for i in range(n):
result += i ** 2
return result

n = 10**7
start = time.time()
sum_of_squares(n)
print("Обычный Python:", time.time() - start)


Теперь ускорим её с помощью Numba:


from numba import jit

@jit(nopython=True)
def sum_of_squares_numba(n):
result = 0
for i in range(n):
result += i ** 2
return result

start = time.time()
sum_of_squares_numba(n)
print("С Numba:", time.time() - start)


📊 Результат:

Код на чистом Python выполняется ~5-10 раз медленнее, чем с Numba.
Numba особенно полезна для математических вычислений и обработки массивов.
Простая аннотация @jit(nopython=True) уже даёт мощный прирост скорости!

Где применять?

Численные расчёты
Обработку данных
Алгоритмы машинного обучения

Попробуйте Numba и напишите в комментариях, удалось ли вам ускорить свой код!

📲 Мы в MAX

👉@BookPython
👍51
🎥 Открытый урок «Django + Telegram Bot: как связать веб-приложение и мессенджер».

🗓 12 февраля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса
«Django-разработчик».

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


На вебинаре разберем:
✔️ Базовую архитектуру взаимодействия Django и Telegram-бота
✔️ Основные способы обмена данными между веб-приложением и мессенджером
✔️Практические сценарии использования Telegram как интерфейса для Django-проекта

В результате вебинара вы:
- Поймёте, как связать Django и Telegram-бота на базовом уровне
- Узнаете, в каких задачах Telegram может быть полезным интерфейсом
- Получите основу, которую сможете развить и применить в собственных проектах

🔗 Ссылка на регистрацию: https://vk.cc/cU2PJU

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM