
- Главная
- Каталог
- Интернет технологии
- Реальный Python
Реальный Python
Основной контент канала Реальный Python это ссылки на полезные статьи на русском и английском языке по программированию на Python.
Статистика канала
BaseModel, а фреймворк сам берет на себя общение с нейросетью, валидацию и ретраи при ошибках формата.
Что разбирается в статье:
• Структурированный вывод: Как заставить агента возвращать строго типизированные объекты вместо "простыни" текста.
• Использование инструментов (Tool Calling): Как с помощью простого декоратора @agent.tool научить LLM вызывать ваши Python-функции (например, для запросов к API или БД).
• Dependency Injection: Безопасный проброс контекста (сессий БД, настроек) в агенты и инструменты с проверкой типов через RunContext.
• Подводные камни: Честный разбор ограничений - как ретраи влияют на расход токенов, стоимость API и почему для масштабных проектов с кучей готовых интеграций всё еще может понадобиться LangChain или LlamaIndex.
Кому будет полезно?
Всем, кто хочет быстро прототипировать ИИ-фичи с минимальным количеством бойлерплейта и максимальным контролем над типами данных.
🔗 Читать туториал полностью: https://realpython.com/pydantic-ai/
#python #pydantic #llm #ai #development #realpython
👉 @python_realpygame.
Это отличный проект для тех, кто хочет подтянуть навыки работы с игровыми циклами, обработкой событий и координатной сеткой.
🛠 Что внутри проекта?
1. Игровое поле: Создаем окно и задаем цвета.
2. Змейка: Представляем её как список координат блоков.
3. Логика движения: Обрабатываем нажатия клавиш (вверх, вниз, влево, вправо).
4. Еда и рост: Генерируем «яблоки» в случайных местах и увеличиваем длину змейки при поедании.
5. Game Over: Условия столкновения со стенами или собственным хвостом.
💻 Кусочек кода для старта:
import pygame
import time
# Инициализация
pygame.init()
white = (255, 255, 255)
snake_speed = 15
# Основной цикл игры
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
# Тут происходит вся магия движения...
{}
В статье подробно разобрано, как собрать всё воедино, настроить экран проигрыша и добавить счетчик очков.
📖 Подробнее: https://towardsdatascience.com/implementing-the-snake-game-in-python/
#python #pygame #coding #gameloop #tutorial
👉 @python_reallist для любых задач, связанных с хранением последовательностей. Но что, если вам нужно эффективно добавлять или удалять элементы с обоих концов структуры?
Здесь на сцену выходит collections.deque (double-ended queue).
🚀 Почему Deque круче списка в определенных задачах?
Главная проблема list в том, что он оптимизирован для операций с правой стороны. Удаление или вставка в начало списка (list.insert(0, v) или list.pop(0)) заставляет Python сдвигать все остальные элементы, что дает сложность .
deque обеспечивает:
🔹O(1) для операций добавления/удаления как слева, так и справа.
🔹Возможность создания кольцевых буферов (ограниченных очередей).
🔹Потокобезопасность для атомарных операций добавления/удаления.
🛠 Примеры использования
from collections import deque
# 1. Создаем дек
d = deque(['middle'])
# 2. Добавляем элементы с двух сторон
d.append('right') # в конец
d.appendleft('left') # в начало
print(d) # deque(['left', 'middle', 'right'])
# 3. Удаляем элементы
d.pop()
d.popleft()
# 4. Ограниченная очередь (самое полезное!)
# Хранит только последние 3 элемента. Идеально для логов или истории.
history = deque(maxlen=3)
for i in range(5):
history.append(f"Action {i}")
print(history)
# Результат: всегда только последние 3 действия
{}
💡 Когда стоит использовать deque?
🔹Реализация очередей (FIFO) и стеков (LIFO).
🔹Алгоритмы обхода графов (BFS - поиск в ширину).
🔹Хранение последних логов или сообщений.
Важный нюанс: Доступ к элементам по индексу в середине дека (📖 Подробнее в статье: https://realpython.com/python-deque/ #python #tips #collections #backend 👉 @python_reald[n]) работает медленнее(O(n)), чем в списке(O(1)). Если вам нужен частый произвольный доступ - оставайтесь наlist.
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 1. Загружаем документы из папки
documents = SimpleDirectoryReader("./data").load_data()
# 2. Создаем индекс (автоматически эмбеддинги и хранение)
index = VectorStoreIndex.from_documents(documents)
# 3. Задаем вопрос
query_engine = index.as_query_engine()
response = query_engine.query("В чем основная мысль отчета за квартал?")
print(response)
{}
Почему стоит попробовать?
1. Актуальность: Модель не будет галлюцинировать, если ответ есть в ваших документах.
2. Экономия: Не нужно переобучать модель - достаточно обновить индекс.
3. Гибкость: Поддерживает как простые скрипты, так и сложные enterprise-архитектуры.
📖 Полный разбор с примерами: https://realpython.com/llamaindex-examples/
#python #llm #llamaindex #ai #rag
👉 @python_realSquare наследуется от Rectangle, он должен вести себя как прямоугольник во всех ситуациях (спойлер: это часто вызывает проблемы).
🔹 I - Interface Segregation (Принцип разделения интерфейса)
Клиенты не должны зависеть от методов, которые они не используют. В Python это решается через создание узкоспециализированных абстрактных классов или протоколов (Protocols), вместо одного огромного интерфейса.
🔹 D - Dependency Inversion (Принцип инверсии зависимостей)
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба должны зависеть от абстракций. Используйте dependency injection, чтобы код был гибким.
👉 Читать полный гайд с примерами рефакторинга: https://realpython.com/solid-principles-python/
👉 @python_real
from functools import wraps
def memoize(func):
cache = {}
@wraps(func)
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
{}
Использование @wraps сохраняет имя функции, docstring и метаданные — критично для дебага и интеграции с Flask.
2. Асинхронность для продакшн
Асинхронность часто ухудшает код, если использовать её неправильно.
import asyncio, aiohttp
TOTAL_REQUESTS = 1_000_000
sem = asyncio.Semaphore(1000)
async def fetch(session, url):
async with sem:
try:
async with session.get(url) as resp:
return await resp.text()
except aiohttp.ClientError:
return None
async def main():
urls = [f"https://api.site/{i}" for i in range(TOTAL_REQUESTS)]
async with aiohttp.ClientSession() as session:
for i in range(0, len(urls), 10_000):
chunk = urls[i:i+10_000]
tasks = [fetch(session, url) for url in chunk]
await asyncio.gather(*tasks)
{}
Контроль через Semaphore + чанки предотвращает OOM и блокировки API. Используйте create_task() для управления жизненным циклом корутин.
3. Ошибки и raise
Не ловите всё подряд и используйте новые возможности языка.
# Python 3.11+
user.is_admin or raise PermissionError("Not allowed!")
{}
raise как выражение и except* (Python 3.11) делают обработку ошибок лаконичной и безопасной:
# Python 3.11+
try:
await asyncio.gather(fail1(), fail2())
except* ValueError as ve: # Только ValueError
print(f"ValueErrors: {ve.exceptions}")
except* TypeError as te: # Только TypeError
print(f"TypeErrors: {te.exceptions}")
{}
4. Типизация и валидация
from pydantic import validate_call
from typing import Annotated
from pydantic.types import Gt, Ge, Le
@validate_call
def calculate_discount(
price: Annotated[float, Gt(0)],
discount: Annotated[float, Ge(0), Le(100)]
) -> float:
return price * (1 - discount / 100)
{}
Constraints прямо в аннотациях делают сигнатуры самодокументируемыми и безопасными без дублирования проверок.
5. Ленивая загрузка и кеширование
@cached_property и functools.cache экономят время при дорогих вычислениях.
from functools import cached_property
import time
class UserReport:
def __init__(self, user_id):
self.user_id = user_id
@cached_property
def total_spent(self):
print("Querying database...")
time.sleep(2) # expensive call
return 199.99
r = UserReport(123)
print(r.total_spent) # computed once
print(r.total_spent) # cached instantly
del r.__dict__["total_spent"]
print(r.total_spent) # recomputed after cache reset
{}
Результат хранится в dict объекта, можно сбросить при необходимости. Отлично подходит для API-запросов и конфигураций.
6. Python 3.14+
Новые возможности языка ускоряют работу и упрощают код:
uuid7() — уникальные и сортируемые по времени ключи
ContextVar как контекстный менеджер
t-strings (t"...") для отложенных шаблонов
subTests для granular тестирования
from string.templatelib import Template
def render(template: Template):
parts = []
for item in template:
if isinstance(item, str):
parts.append(item)
else:
parts.append(item.value)
return "".join(parts)
user = "Alice"
role = "admin"
t = t"user: {user} — role: {role}"
s = render(t)
{}
Жалко что не добавили .format() для t -строк
Заключение
Даже небольшие изменения в подходе к разработке дают ощутимый эффект на качество кода и скорость разработки.
👉 @python_realОтзывы канала
всего 3 отзыва
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Реальный Python — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 3.8K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 5.2, количество отзывов – 3, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 2727.27 ₽, а за 25 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий