Основы работы с декораторами Python
В этом уроке по декораторам Python вы узнаете, что они собой представляют, как их создавать и использовать. Декораторы предоставляют простой синтаксис для вызова функций более высокого порядка.
По определению, декоратор - это функция, которая принимает другую функцию и расширяет поведение последней, не изменяя ее в явном виде. Звучит запутанно, но все станет понятнее после того, как вы увидите несколько примеров работы декораторов.
https://realpython.com/primer-on-python-decorators/
#python
👉 @python_real
В этом уроке по декораторам Python вы узнаете, что они собой представляют, как их создавать и использовать. Декораторы предоставляют простой синтаксис для вызова функций более высокого порядка.
По определению, декоратор - это функция, которая принимает другую функцию и расширяет поведение последней, не изменяя ее в явном виде. Звучит запутанно, но все станет понятнее после того, как вы увидите несколько примеров работы декораторов.
https://realpython.com/primer-on-python-decorators/
#python
👉 @python_real
👍2
Python calendar Module: Создание календарей с помощью Python
Python calendar module предоставляет несколько способов создания календарей для Python-программ. Он также включает в себя множество функций для работы с данными календаря в виде строк, чисел и объектов времени даты.
В этом уроке вы узнаете, как использовать модуль calendar для создания и настройки календарей в Python.
https://realpython.com/python-calendar-module/
#python
👉 @python_real
Python calendar module предоставляет несколько способов создания календарей для Python-программ. Он также включает в себя множество функций для работы с данными календаря в виде строк, чисел и объектов времени даты.
В этом уроке вы узнаете, как использовать модуль calendar для создания и настройки календарей в Python.
https://realpython.com/python-calendar-module/
#python
👉 @python_real
👍2❤1
Мы покрываем асинхронность, метапрограммирование, профилирование и безопасность кода, а также глубокую работу с FastAPI, Django, Pandas и другими ключевыми инструментами.
🦾Вы сможете проектировать высокопроизводительные веб-сервисы и RESTful API, интегрировать ML-модели, анализировать и визуализировать большие данные, писать чистый и безопасный код по паттернам проектирования.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Установка и выполнение приложений Python с использованием pipx
В этом руководстве вы узнаете об инструменте pipx, который позволяет удобно устанавливать и запускать пакеты Python как автономные приложения командной строки в изолированных средах.
https://realpython.com/python-pipx/
👉 @python_real
В этом руководстве вы узнаете об инструменте pipx, который позволяет удобно устанавливать и запускать пакеты Python как автономные приложения командной строки в изолированных средах.
https://realpython.com/python-pipx/
👉 @python_real
👍2
Практичные Python-привычки, которые реально повышают качество кода
1. Явное состояние и мемоизация
Скрытые состояния в замыканиях и декораторах часто приводят к трудноуловимым багам.
Использование
2. Асинхронность для продакшн
Асинхронность часто ухудшает код, если использовать её неправильно.
Контроль через Semaphore + чанки предотвращает OOM и блокировки API. Используйте create_task() для управления жизненным циклом корутин.
3. Ошибки и raise
Не ловите всё подряд и используйте новые возможности языка.
raise как выражение и except* (Python 3.11) делают обработку ошибок лаконичной и безопасной:
4. Типизация и валидация
Constraints прямо в аннотациях делают сигнатуры самодокументируемыми и безопасными без дублирования проверок.
5. Ленивая загрузка и кеширование
Результат хранится в dict объекта, можно сбросить при необходимости. Отлично подходит для API-запросов и конфигураций.
6. Python 3.14+
Новые возможности языка ускоряют работу и упрощают код:
uuid7() — уникальные и сортируемые по времени ключи
ContextVar как контекстный менеджер
t-strings (t"...") для отложенных шаблонов
subTests для granular тестирования
Жалко что не добавили .format() для t -строк
Заключение
Даже небольшие изменения в подходе к разработке дают ощутимый эффект на качество кода и скорость разработки.
👉 @python_real
1. Явное состояние и мемоизация
Скрытые состояния в замыканиях и декораторах часто приводят к трудноуловимым багам.
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
👍2
🐍 SOLID принципы в Python: Фундамент чистого кода
Хотите писать код, который легко поддерживать, тестировать и масштабировать? Тогда вам точно стоит внедрить в свои проекты принципы SOLID. Это «золотой стандарт» объектно-ориентированного программирования, который отлично ложится и на Python.
🔹 S - Single Responsibility (Принцип единственной ответственности)
У класса должна быть только одна причина для изменения. Не делайте «божественные объекты», которые умеют всё. Разделяйте логику: один класс управляет файлами, другой - сжимает их в zip.
🔹 O - Open-Closed (Принцип открытости/закрытости)
Сущности (классы, модули) должны быть открыты для расширения, но закрыты для модификации. Хотите добавить новую фигуру? Не переписывайте старый класс, а создайте новый, наследуясь от абстракции.
🔹 L - Liskov Substitution (Принцип подстановки Барбары Лисков)
Объекты подклассов должны заменять объекты родительских классов без поломки кода. Если
🔹 I - Interface Segregation (Принцип разделения интерфейса)
Клиенты не должны зависеть от методов, которые они не используют. В Python это решается через создание узкоспециализированных абстрактных классов или протоколов (Protocols), вместо одного огромного интерфейса.
🔹 D - Dependency Inversion (Принцип инверсии зависимостей)
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба должны зависеть от абстракций. Используйте dependency injection, чтобы код был гибким.
👉 Читать полный гайд с примерами рефакторинга: https://realpython.com/solid-principles-python/
👉 @python_real
Хотите писать код, который легко поддерживать, тестировать и масштабировать? Тогда вам точно стоит внедрить в свои проекты принципы SOLID. Это «золотой стандарт» объектно-ориентированного программирования, который отлично ложится и на Python.
🔹 S - Single Responsibility (Принцип единственной ответственности)
У класса должна быть только одна причина для изменения. Не делайте «божественные объекты», которые умеют всё. Разделяйте логику: один класс управляет файлами, другой - сжимает их в zip.
🔹 O - Open-Closed (Принцип открытости/закрытости)
Сущности (классы, модули) должны быть открыты для расширения, но закрыты для модификации. Хотите добавить новую фигуру? Не переписывайте старый класс, а создайте новый, наследуясь от абстракции.
🔹 L - Liskov Substitution (Принцип подстановки Барбары Лисков)
Объекты подклассов должны заменять объекты родительских классов без поломки кода. Если
Square наследуется от Rectangle, он должен вести себя как прямоугольник во всех ситуациях (спойлер: это часто вызывает проблемы).🔹 I - Interface Segregation (Принцип разделения интерфейса)
Клиенты не должны зависеть от методов, которые они не используют. В Python это решается через создание узкоспециализированных абстрактных классов или протоколов (Protocols), вместо одного огромного интерфейса.
🔹 D - Dependency Inversion (Принцип инверсии зависимостей)
Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба должны зависеть от абстракций. Используйте dependency injection, чтобы код был гибким.
👉 Читать полный гайд с примерами рефакторинга: https://realpython.com/solid-principles-python/
👉 @python_real
👍2
🦙 LlamaIndex: Ваш персональный мост между данными и LLM
Многие думают, что для работы нейросети с вашими личными документами нужно заниматься сложным «файнтюнингом». На самом деле, чаще всего достаточно RAG (Retrieval-Augmented Generation). И здесь королем выступает LlamaIndex.
Что это такое?
Если LangChain это швейцарский нож для любых задач с цепочками действий, то LlamaIndex специализируется именно на данных. Он берет ваши PDF, базы данных или заметки из Notion и превращает их в формат, который «понимает» LLM (например, GPT-4).
Ключевые возможности из свежего гайда:
🔹Data Connectors: Загрузка данных из 100+ источников (Slack, Google Drive, Postgres и т.д.).
🔹Indexing: Разбиение текста на умные фрагменты (nodes) и создание векторных индексов для быстрого поиска.
🔹Query Engine: Интерфейс, который позволяет «общаться» со своими данными на естественном языке.
Мини-пример кода:
Всего несколько строк, чтобы заставить модель отвечать по вашему локальному файлу:
Почему стоит попробовать?
1. Актуальность: Модель не будет галлюцинировать, если ответ есть в ваших документах.
2. Экономия: Не нужно переобучать модель - достаточно обновить индекс.
3. Гибкость: Поддерживает как простые скрипты, так и сложные enterprise-архитектуры.
📖 Полный разбор с примерами: https://realpython.com/llamaindex-examples/
#python #llm #llamaindex #ai #rag
👉 @python_real
Многие думают, что для работы нейросети с вашими личными документами нужно заниматься сложным «файнтюнингом». На самом деле, чаще всего достаточно RAG (Retrieval-Augmented Generation). И здесь королем выступает LlamaIndex.
Что это такое?
Если LangChain это швейцарский нож для любых задач с цепочками действий, то LlamaIndex специализируется именно на данных. Он берет ваши PDF, базы данных или заметки из Notion и превращает их в формат, который «понимает» LLM (например, GPT-4).
Ключевые возможности из свежего гайда:
🔹Data Connectors: Загрузка данных из 100+ источников (Slack, Google Drive, Postgres и т.д.).
🔹Indexing: Разбиение текста на умные фрагменты (nodes) и создание векторных индексов для быстрого поиска.
🔹Query Engine: Интерфейс, который позволяет «общаться» со своими данными на естественном языке.
Мини-пример кода:
Всего несколько строк, чтобы заставить модель отвечать по вашему локальному файлу:
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_real
👍4
🐍 Python Deque: Когда обычного списка недостаточно
Многие используют стандартный
Здесь на сцену выходит
🚀 Почему Deque круче списка в определенных задачах?
Главная проблема
🔹
🔹Возможность создания кольцевых буферов (ограниченных очередей).
🔹Потокобезопасность для атомарных операций добавления/удаления.
🛠 Примеры использования
💡 Когда стоит использовать
🔹Реализация очередей (FIFO) и стеков (LIFO).
🔹Алгоритмы обхода графов (BFS - поиск в ширину).
🔹Хранение последних логов или сообщений.
📖 Подробнее в статье: https://realpython.com/python-deque/
#python #tips #collections #backend
👉 @python_real
Многие используют стандартный
list для любых задач, связанных с хранением последовательностей. Но что, если вам нужно эффективно добавлять или удалять элементы с обоих концов структуры?Здесь на сцену выходит
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 - поиск в ширину).
🔹Хранение последних логов или сообщений.
Важный нюанс: Доступ к элементам по индексу в середине дека (d[n]) работает медленнее(O(n)), чем в списке(O(1)). Если вам нужен частый произвольный доступ - оставайтесь наlist.
📖 Подробнее в статье: https://realpython.com/python-deque/
#python #tips #collections #backend
👉 @python_real
👍4
👨💻В Python-проектах со временем появляется одна и та же проблема: код работает, но становится всё сложнее поддерживать его, расширять и объяснять коллегам. Особенно в долгоживущих системах, где архитектурные решения начинают играть не меньшую роль, чем сама бизнес-логика.
На открытом уроке OTUS разберём паттерны проектирования и их применение в Python-приложениях. Обсудим, какие паттерны существуют, зачем они нужны и как классические идеи объектно-ориентированного проектирования адаптируются под Python, несмотря на то, что изначально формировались для других языков.
Вы поймёте, в каких задачах паттерны действительно помогают, научитесь различать основные группы паттернов и видеть их область применимости. Разберём, как использовать паттерны в Python без излишнего усложнения кода.
💥Встречаемся 10 февраля в 20:00 МСК в преддверии старта курса «Python Developer. Professional». Регистрация открыта: https://vk.cc/cU5auL
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
На открытом уроке OTUS разберём паттерны проектирования и их применение в Python-приложениях. Обсудим, какие паттерны существуют, зачем они нужны и как классические идеи объектно-ориентированного проектирования адаптируются под Python, несмотря на то, что изначально формировались для других языков.
Вы поймёте, в каких задачах паттерны действительно помогают, научитесь различать основные группы паттернов и видеть их область применимости. Разберём, как использовать паттерны в Python без излишнего усложнения кода.
💥Встречаемся 10 февраля в 20:00 МСК в преддверии старта курса «Python Developer. Professional». Регистрация открыта: https://vk.cc/cU5auL
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❤1💩1🕊1