YAML: The Missing Battery in Python
YAML (YAML Ain’t Markup Language) - это человекочитаемый формат сериализации данных, который часто используется для файлов конфигураций, обмена данными между языками и управления инфраструктурой (например, в Docker, Kubernetes и т. д.).
В Python с YAML удобно работать с помощью библиотеки PyYAML. Она позволяет:
- читать YAML-файлы и преобразовывать их в стандартные Python-объекты (
- записывать данные обратно в YAML;
- безопасно загружать данные с помощью
- использовать настраиваемые объекты и теги для сериализации нестандартных типов.
Пример загрузки YAML-файла:
Пример записи:
Также PyYAML поддерживает:
- настройку форматирования вывода (
- пользовательские конструкторы и представления (
- и интеграцию с другими инструментами DevOps.
https://realpython.com/python-yaml/
#python
👉 @python_real
YAML (YAML Ain’t Markup Language) - это человекочитаемый формат сериализации данных, который часто используется для файлов конфигураций, обмена данными между языками и управления инфраструктурой (например, в Docker, Kubernetes и т. д.).
В Python с YAML удобно работать с помощью библиотеки PyYAML. Она позволяет:
- читать YAML-файлы и преобразовывать их в стандартные Python-объекты (
dict, list, str, и т. д.);- записывать данные обратно в YAML;
- безопасно загружать данные с помощью
safe_load() (чтобы избежать выполнения произвольного кода);- использовать настраиваемые объекты и теги для сериализации нестандартных типов.
Пример загрузки YAML-файла:
import yaml
with open("config.yaml", "r") as f:
config = yaml.safe_load(f)
print(config)
Пример записи:
import yaml
data = {"name": "Oleg", "skills": ["Python", "AI", "ML"]}
with open("output.yaml", "w") as f:
yaml.dump(data, f)
Также PyYAML поддерживает:
- настройку форматирования вывода (
default_flow_style=False, indent и т. д.),- пользовательские конструкторы и представления (
add_constructor, add_representer),- и интеграцию с другими инструментами DevOps.
https://realpython.com/python-yaml/
#python
👉 @python_real
👍3
🧼 Методы
Работая с текстом в Python, часто нужно удалить лишние пробелы или символы с краёв строки. Именно для этого существуют методы
Основы
По умолчанию эти методы удаляют пробелы, переводы строк, табуляции и другие пробельные символы.
Удаление определённых символов
Можно передать в метод строку с символами, которые нужно удалить:
Важно: метод удаляет все указанные символы, а не подстроку. То есть
Применение в реальной жизни
- Очистка данных перед обработкой.
- Удаление лишних символов после парсинга.
- Нормализация пользовательского ввода.
Совет
Если нужно удалить только начало или только конец строки — используй
https://realpython.com/python-strip/
#python
👉 @python_real
strip(), lstrip() и rstrip() в Python: удаление пробелов и символовРаботая с текстом в Python, часто нужно удалить лишние пробелы или символы с краёв строки. Именно для этого существуют методы
strip(), lstrip() и rstrip().Основы
text = " hello world "
print(text.strip()) # 'hello world'
print(text.lstrip()) # 'hello world '
print(text.rstrip()) # ' hello world'
По умолчанию эти методы удаляют пробелы, переводы строк, табуляции и другие пробельные символы.
Удаление определённых символов
Можно передать в метод строку с символами, которые нужно удалить:
text = ".,!?hello world!?.,"
print(text.strip(".,!?")) # 'hello world'
Важно: метод удаляет все указанные символы, а не подстроку. То есть
strip("abc") удалит все a, b и c, а не строку "abc".Применение в реальной жизни
- Очистка данных перед обработкой.
- Удаление лишних символов после парсинга.
- Нормализация пользовательского ввода.
Совет
Если нужно удалить только начало или только конец строки — используй
lstrip() или rstrip() соответственно.https://realpython.com/python-strip/
#python
👉 @python_real
👍4
Python MarkItDown: преобразование документов в Markdown для LLM
Библиотека MarkItDown позволяет быстро преобразовывать PDF, файлы Office, изображения, HTML, аудио и URL в Markdown, готовый для использования в языковых моделях (LLM). В этом руководстве вы сравните MarkItDown с Pandoc, запустите его из командной строки, используете в Python-коде и встроите конвертацию в рабочие процессы с ИИ.
По завершении урока вы поймёте следующее:
- MarkItDown можно установить через
- В командной версии (CLI) результат можно сохранить в файл с помощью опции
- Метод
- Сервер MCP MarkItDown можно подключать к клиентам вроде Claude Desktop, чтобы выполнять конвертацию по запросу прямо в чате.
- MarkItDown может интегрироваться с LLM для генерации описаний изображений и извлечения текста с помощью OCR и пользовательских промптов.
https://realpython.com/python-markitdown/
#python
👉 @python_real
Библиотека MarkItDown позволяет быстро преобразовывать PDF, файлы Office, изображения, HTML, аудио и URL в Markdown, готовый для использования в языковых моделях (LLM). В этом руководстве вы сравните MarkItDown с Pandoc, запустите его из командной строки, используете в Python-коде и встроите конвертацию в рабочие процессы с ИИ.
По завершении урока вы поймёте следующее:
- MarkItDown можно установить через
pip, используя спецификатор [all], чтобы подтянуть необязательные зависимости.- В командной версии (CLI) результат можно сохранить в файл с помощью опции
-o или --output, указав путь назначения.- Метод
.convert() читает входной документ и преобразует его в Markdown.- Сервер MCP MarkItDown можно подключать к клиентам вроде Claude Desktop, чтобы выполнять конвертацию по запросу прямо в чате.
- MarkItDown может интегрироваться с LLM для генерации описаний изображений и извлечения текста с помощью OCR и пользовательских промптов.
https://realpython.com/python-markitdown/
#python
👉 @python_real
❤2👍1
Основы работы с декораторами 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
🦙 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
👍5
🐍 Создаем классическую «Змейку» на Python за 15 минут!
Помните те времена, когда мы часами залипали в «Змейку» на старых Nokia? Самое крутое, что механику этой легендарной игры можно воссоздать на Python, используя библиотеку
Это отличный проект для тех, кто хочет подтянуть навыки работы с игровыми циклами, обработкой событий и координатной сеткой.
🛠 Что внутри проекта?
1. Игровое поле: Создаем окно и задаем цвета.
2. Змейка: Представляем её как список координат блоков.
3. Логика движения: Обрабатываем нажатия клавиш (вверх, вниз, влево, вправо).
4. Еда и рост: Генерируем «яблоки» в случайных местах и увеличиваем длину змейки при поедании.
5. Game Over: Условия столкновения со стенами или собственным хвостом.
💻 Кусочек кода для старта:
В статье подробно разобрано, как собрать всё воедино, настроить экран проигрыша и добавить счетчик очков.
📖 Подробнее: https://towardsdatascience.com/implementing-the-snake-game-in-python/
#python #pygame #coding #gameloop #tutorial
👉 @python_real
Помните те времена, когда мы часами залипали в «Змейку» на старых Nokia? Самое крутое, что механику этой легендарной игры можно воссоздать на Python, используя библиотеку
pygame.Это отличный проект для тех, кто хочет подтянуть навыки работы с игровыми циклами, обработкой событий и координатной сеткой.
🛠 Что внутри проекта?
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_real
👍2🍾2
🚀 Pydantic AI: Создаем типобезопасных LLM-агентов на Python
Если вы устали писать костыли для парсинга сырого текста от LLM, этот инструмент решает проблему изящно: вы задаете схемы через
Что разбирается в статье:
• Структурированный вывод: Как заставить агента возвращать строго типизированные объекты вместо "простыни" текста.
• Использование инструментов (Tool Calling): Как с помощью простого декоратора
• Dependency Injection: Безопасный проброс контекста (сессий БД, настроек) в агенты и инструменты с проверкой типов через
• Подводные камни: Честный разбор ограничений - как ретраи влияют на расход токенов, стоимость API и почему для масштабных проектов с кучей готовых интеграций всё еще может понадобиться LangChain или LlamaIndex.
Кому будет полезно?
Всем, кто хочет быстро прототипировать ИИ-фичи с минимальным количеством бойлерплейта и максимальным контролем над типами данных.
🔗 Читать туториал полностью: https://realpython.com/pydantic-ai/
#python #pydantic #llm #ai #development #realpython
👉 @python_real
Если вы устали писать костыли для парсинга сырого текста от LLM, этот инструмент решает проблему изящно: вы задаете схемы через
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_real
❤1👍1
Вложенные циклы в Python
Вложенные циклы позволяют размещать один цикл внутри другого и тем самым выполнять повторяющиеся действия над несколькими последовательностями. Понимание этой концепции помогает писать более эффективный код, управлять сложными структурами данных и избегать проблем с читабельностью и производительностью.
Начало работы с вложенными циклами
В Python есть два основных типа циклов —
*
*
Вложенный цикл создаётся размещением одного цикла внутри другого:
Для каждой итерации внешнего цикла внутренний выполняется полностью.
Аналогия: часовая и минутная стрелки часов. Часовая проходит круг за 12 часов, минутная — за 1 час, но работают они совместно.
Практические примеры
Печать шаблонов
Таблица умножения
Суммирование элементов во вложенных списках
Парные комбинации без самих себя
Вложенный
Частые проблемы вложенных циклов
* Область видимости переменных. Не используйте одинаковые имена во внешнем и внутреннем циклах.
* Читаемость. Глубокая вложенность усложняет понимание кода.
* Производительность. Каждый дополнительный уровень увеличивает временную сложность (часто до
Оптимизация
*
* List Comprehension делает выражения компактнее, хотя не всегда улучшает производительность.
Вывод
Вложенные циклы — мощный инструмент для работы с многомерными данными и повторяющимися задачами. Однако злоупотребление ими ухудшает читаемость и скорость. Используйте их осознанно, оптимизируйте при помощи
https://realpython.com/nested-loops-python/
#python
👉 @python_real
Вложенные циклы позволяют размещать один цикл внутри другого и тем самым выполнять повторяющиеся действия над несколькими последовательностями. Понимание этой концепции помогает писать более эффективный код, управлять сложными структурами данных и избегать проблем с читабельностью и производительностью.
Начало работы с вложенными циклами
В Python есть два основных типа циклов —
for и while.*
for -цикл проходит по элементам последовательности (списка, диапазона и т. д.), когда количество итераций известно заранее.*
while -цикл выполняется, пока истинно заданное условие, и полезен, когда число итераций заранее не определено.Вложенный цикл создаётся размещением одного цикла внутри другого:
for outer_variable in outer_iterable:
for inner_variable in inner_iterable:
<body>
Для каждой итерации внешнего цикла внутренний выполняется полностью.
Аналогия: часовая и минутная стрелки часов. Часовая проходит круг за 12 часов, минутная — за 1 час, но работают они совместно.
for hour in range(24):
for minute in range(60):
print(f"{hour:02d}:{minute:02d}")
Практические примеры
Печать шаблонов
height = 6
sail_patterns = "*#-x+o"
for row in range(height):
pattern = ""
spacing = " " * (height - row)
for symbol in sail_patterns:
pattern += symbol * row + spacing
print(pattern)
Таблица умножения
for multiplicant in range(1, 11):
for multiplier in range(1, 4):
expression = f"{multiplicant:>2d} × {multiplier}"
product = multiplicant * multiplier
print(f"{expression} = {product:>2d}", end="\t")
print()
Суммирование элементов во вложенных списках
resource_donators = [
[8, 6, 3],
[9, 2, 7],
[4, 1, 5]
]
total_resources = 0
for planet in resource_donators:
for resource in planet:
total_resources += resource
print(total_resources) # 45
Парные комбинации без самих себя
players = ["Bonnie", "Mike", "Raj", "Adah"]
for player1 in players:
for player2 in players:
if player1 != player2:
print(f"{player1} vs {player2}")
Вложенный
while
while True:
word = input("Введите слово (exit — для выхода): ")
if word == "exit":
break
for letter in word:
print(letter)
Частые проблемы вложенных циклов
* Область видимости переменных. Не используйте одинаковые имена во внешнем и внутреннем циклах.
* Читаемость. Глубокая вложенность усложняет понимание кода.
* Производительность. Каждый дополнительный уровень увеличивает временную сложность (часто до
O(n²) и выше).Оптимизация
*
break и continue позволяют досрочно завершать цикл или пропускать ненужные итерации.* List Comprehension делает выражения компактнее, хотя не всегда улучшает производительность.
# Поиск "bacon" с break
for layer in blt_sandwich:
for ingredient in layer:
if ingredient == target:
print("Found bacon!")
break
if target in layer:
break
Вывод
Вложенные циклы — мощный инструмент для работы с многомерными данными и повторяющимися задачами. Однако злоупотребление ими ухудшает читаемость и скорость. Используйте их осознанно, оптимизируйте при помощи
break, continue и list comprehension, и никогда не забывайте о сложности алгоритма.https://realpython.com/nested-loops-python/
#python
👉 @python_real
👍2❤1
🐍 Как работают интерфейсы в Python и зачем они нужны?
В Python нет специального ключевого слова
Свежая и очень подробная статья от *Real Python* разбирает, как правильно реализовывать интерфейсы в Python. Вот два основных механизма:
🔹 Абстрактные базовые классы (ABCs)
Используем модуль
🔹 Протоколы (Protocols)
Современный подход структурной типизации с помощью
🦆 Duck Typing (Утиная типизация)
Куда же без нее! Python по своей природе динамичен: "если объект ходит как утка и крякает как утка, то это утка". ABC и Протоколы просто берут эту концепцию и делают ее безопаснее, позволяя использовать
Понимание интерфейсов помогает применять принципы объектно-ориентированного дизайна (SOLID) и писать код, который работает с различными типами данных без жесткой привязки к их конкретным реализациям.
https://realpython.com/python-interface/
#python
👉 @python_real
В Python нет специального ключевого слова
interface (как, например, в Java или C#), но это не значит, что мы не можем создавать надежные контракты для наших классов!Свежая и очень подробная статья от *Real Python* разбирает, как правильно реализовывать интерфейсы в Python. Вот два основных механизма:
🔹 Абстрактные базовые классы (ABCs)
Используем модуль
abc и декоратор @abstractmethod. Это строгий подход на основе наследования: если ваш дочерний класс не реализует все необходимые методы, Python выдаст ошибку TypeError еще на этапе создания объекта (instantiation), а не тогда, когда код упадет во время выполнения.🔹 Протоколы (Protocols)
Современный подход структурной типизации с помощью
typing.Protocol. Вашим классам вообще не нужно наследовать протокол — достаточно просто иметь нужные методы с правильными сигнатурами. Это идеально подходит для проверки статическими анализаторами кода (например, `mypy`).🦆 Duck Typing (Утиная типизация)
Куда же без нее! Python по своей природе динамичен: "если объект ходит как утка и крякает как утка, то это утка". ABC и Протоколы просто берут эту концепцию и делают ее безопаснее, позволяя использовать
isinstance() и issubclass() для проверки контрактов.Понимание интерфейсов помогает применять принципы объектно-ориентированного дизайна (SOLID) и писать код, который работает с различными типами данных без жесткой привязки к их конкретным реализациям.
https://realpython.com/python-interface/
#python
👉 @python_real
👍1
UV
Чрезвычайно быстрый менеджер пакетов и проектов на языке Python, написанный на Rust.
Создатели позиционируют его как замену pip, pip-tools и virtualenv. Это, кстати, те же разработчики, которые сделали линтер Ruff.
https://astral.sh/blog/uv
https://github.com/astral-sh/uv
#python
👉 @python_real
Чрезвычайно быстрый менеджер пакетов и проектов на языке Python, написанный на Rust.
Создатели позиционируют его как замену pip, pip-tools и virtualenv. Это, кстати, те же разработчики, которые сделали линтер Ruff.
https://astral.sh/blog/uv
https://github.com/astral-sh/uv
#python
👉 @python_real
👍2😁2
Реализация парсеров с Pylasu
В этой статье рассказывается, как реализовать парсеры на Python с использованием Pylasu и ANTLR. Пошагово:
1. Создадим грамматику ANTLR для простого языка программирования Slang и сгенерируем парсер.
2. Определим абстрактное синтаксическое дерево (AST) с помощью Pylasu и научимся строить его из дерева разбора ANTLR.
3. Интегрируем парсер с CLI-приложением для обработки кода Slang из строк и файлов, с выводом AST в формате JSON.
Полный код проекта доступен на GitHub. Вы можете экспериментировать, вносить улучшения и делиться идеями!
https://tomassetti.me/implement-parsers-with-pylasu/
#python
👉 @python_real
В этой статье рассказывается, как реализовать парсеры на Python с использованием Pylasu и ANTLR. Пошагово:
1. Создадим грамматику ANTLR для простого языка программирования Slang и сгенерируем парсер.
2. Определим абстрактное синтаксическое дерево (AST) с помощью Pylasu и научимся строить его из дерева разбора ANTLR.
3. Интегрируем парсер с CLI-приложением для обработки кода Slang из строк и файлов, с выводом AST в формате JSON.
Полный код проекта доступен на GitHub. Вы можете экспериментировать, вносить улучшения и делиться идеями!
https://tomassetti.me/implement-parsers-with-pylasu/
#python
👉 @python_real
👍2
Начиная с Python 3.0, при возникновении нового исключения внутри блока
Кроме того, вы можете явно указать причинное исключение, использовав конструкцию
#python
👉 @python_real
except перехваченное исключение автоматически сохраняется в атрибуте __context__ создаваемого исключения. В результате при выводе будут показаны оба исключения:
try:
1 / 0
except ZeroDivisionError:
raise ValueError('Zero!')
(most recent call last):
File "test.py", line 2, in <module>
1 / 0
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 4, in <module>
raise ValueError('Zero!')
ValueError: Zero!
Кроме того, вы можете явно указать причинное исключение, использовав конструкцию
raise … from. Тогда в атрибут __cause__ нового исключения будет помещено исходное:
division_error = None
try:
1 / 0
except ZeroDivisionError as e:
division_error = e
raise ValueError('Zero!') from division_error
(most recent call last):
File "test.py", line 4, in <module>
1 / 0
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "test.py", line 8, in <module>
raise ValueError('Zero!') from division_error
ValueError: Zero!
#python
👉 @python_real
👍1
Метод
Имя поля используется для указания, какой именно аргумент должен быть подставлен:
Преобразование позволяет указать, что вместо
Спецификация формата задаёт, как значения будут представлены:
Эта спецификация может быть применена и к отдельному объекту с помощью функции
Функция
#python
👉 @python_real
format в Python для строк — мощный инструмент, поддерживающий множество возможностей, о которых вы, возможно, даже не знали. Каждый заменяемый плейсхолдер ({...}) может содержать три части: имя поля, преобразование и спецификацию формата.Имя поля используется для указания, какой именно аргумент должен быть подставлен:
>>> '{}'.format(42)
'42'
>>> '{1}'.format(1, 2)
'2'
>>> '{y}'.format(x=1, y=2)
'2'
Преобразование позволяет указать, что вместо
str() следует использовать repr() (или ascii()) при преобразовании объектов в строки:
>>> '{!r}'.format(datetime.now())
'datetime.datetime(2018, 5, 3, 23, 48, 49, 157037)'
>>> '{}'.format(datetime.now())
'2018-05-03 23:49:01.060852'
Спецификация формата задаёт, как значения будут представлены:
>>> '{:+,}'.format(1234567)
'+1,234,567'
>>> '{:>19}'.format(1234567)
' 1234567'
Эта спецификация может быть применена и к отдельному объекту с помощью функции
format (не метода str):
>>> format(5000000, '+,')
'+5,000,000'
Функция
format вызывает метод __format__ объекта, поэтому вы можете изменить его поведение для своих типов.#python
👉 @python_real
❤1👍1
🐍 Интерфейсы в Python: когда
В Python нет привычных интерфейсов, как в Java или C#, но это не значит, что их нельзя использовать. На практике разработчики применяют несколько подходов — от обычного duck typing до абстрактных базовых классов (
Что важно знать:
🔹 Duck typing — классический подход Python. Если объект реализует нужные методы, значит, он подходит, независимо от наследования.
🔹 ABC (Abstract Base Classes) — позволяют явно определить набор обязательных методов. Если наследник не реализует их, создать экземпляр класса не получится.
🔹 Protocol — современный способ описывать интерфейсы без наследования. Особенно полезен при использовании статической проверки типов (
💡 Когда что использовать?
* Небольшие проекты — достаточно duck typing.
* Средние и крупные проекты —
* Современные кодовые базы с type hints — чаще всего лучший выбор
Если вы до сих пор считаете, что интерфейсов в Python нет, возможно, вы просто ещё не познакомились с
https://realpython.com/python-interface/
#python
👉 @python_real
ABC уже недостаточно?В Python нет привычных интерфейсов, как в Java или C#, но это не значит, что их нельзя использовать. На практике разработчики применяют несколько подходов — от обычного duck typing до абстрактных базовых классов (
abc) и современных Protocol из модуля typing. Что важно знать:
🔹 Duck typing — классический подход Python. Если объект реализует нужные методы, значит, он подходит, независимо от наследования.
🔹 ABC (Abstract Base Classes) — позволяют явно определить набор обязательных методов. Если наследник не реализует их, создать экземпляр класса не получится.
🔹 Protocol — современный способ описывать интерфейсы без наследования. Особенно полезен при использовании статической проверки типов (
mypy, Pyright и др.). Код становится гибче, а зависимости между классами — слабее. 💡 Когда что использовать?
* Небольшие проекты — достаточно duck typing.
* Средние и крупные проекты —
ABC помогает избежать ошибок реализации.* Современные кодовые базы с type hints — чаще всего лучший выбор
Protocol, который не требует наследования и отлично сочетается с IDE и статическими анализаторами. Если вы до сих пор считаете, что интерфейсов в Python нет, возможно, вы просто ещё не познакомились с
Protocol.https://realpython.com/python-interface/
#python
👉 @python_real
👍1
🐍 Как использовать Claude Code для разработки и отладки проектов на Python
Real Python опубликовал подробное руководство по работе с Claude Code — консольным ИИ-инструментом, который запускается непосредственно в каталоге проекта.
В отличие от браузерных чат-ботов, Claude Code может:
🔹 изучать структуру проекта и содержимое файлов;
🔹 создавать и редактировать код;
🔹 показывать изменения в формате diff;
🔹 запускать команды и тесты;
🔹 искать и исправлять ошибки;
🔹 работать с Git и создавать коммиты.
В руководстве предлагается с нуля разработать на Python консольный менеджер контактов. Сначала Claude Code составляет план и структуру приложения, затем генерирует код, проверяет его работу и пишет тесты. После этого инструмент используют для анализа уже существующего проекта и исправления найденных проблем.
Отдельное внимание уделено безопасному рабочему процессу:
✅ запускать Claude Code только внутри каталога проекта;
✅ начинать сложные задачи в режиме Plan;
✅ хранить требования к проекту в файле
✅ проверять каждый diff перед применением;
✅ запускать тесты после изменений;
✅ регулярно создавать коммиты, чтобы иметь возможность отката.
Для работы потребуется платная подписка Claude либо учётная запись Anthropic Console с подключённой оплатой API.
https://realpython.com/how-to-use-claude-code/
#python
👉 @python_real
Real Python опубликовал подробное руководство по работе с Claude Code — консольным ИИ-инструментом, который запускается непосредственно в каталоге проекта.
В отличие от браузерных чат-ботов, Claude Code может:
🔹 изучать структуру проекта и содержимое файлов;
🔹 создавать и редактировать код;
🔹 показывать изменения в формате diff;
🔹 запускать команды и тесты;
🔹 искать и исправлять ошибки;
🔹 работать с Git и создавать коммиты.
В руководстве предлагается с нуля разработать на Python консольный менеджер контактов. Сначала Claude Code составляет план и структуру приложения, затем генерирует код, проверяет его работу и пишет тесты. После этого инструмент используют для анализа уже существующего проекта и исправления найденных проблем.
Отдельное внимание уделено безопасному рабочему процессу:
✅ запускать Claude Code только внутри каталога проекта;
✅ начинать сложные задачи в режиме Plan;
✅ хранить требования к проекту в файле
CLAUDE.md;✅ проверять каждый diff перед применением;
✅ запускать тесты после изменений;
✅ регулярно создавать коммиты, чтобы иметь возможность отката.
Для работы потребуется платная подписка Claude либо учётная запись Anthropic Console с подключённой оплатой API.
https://realpython.com/how-to-use-claude-code/
#python
👉 @python_real
👍2
🐍 Асинхронное программирование в Python: от генераторов до asyncio
Почему обычная программа простаивает во время сетевых запросов, обращения к базе данных или чтения файлов? И как заставить её выполнять другие задачи, пока она ждёт ответа?
В новом подробном руководстве Real Python асинхронность разбирают постепенно — от синхронного кода и генераторов с yield до полноценной работы с asyncio.
Из материала вы узнаете:
🔹 чем синхронное выполнение отличается от асинхронного;
🔹 что такое блокирующие и неблокирующие операции;
🔹 как устроен цикл событий;
🔹 как работают async, await и корутины;
🔹 как запускать несколько задач через asyncio.TaskGroup;
🔹 почему асинхронность особенно полезна для HTTP-запросов, баз данных и другого I/O;
🔹 как отслеживать состояние выполняющихся задач.
Авторы не просто показывают готовый код, а последовательно создают собственную модель кооперативной многозадачности на генераторах. Благодаря этому становится понятнее, что именно скрывается за работой asyncio.
Примеры рассчитаны на Python 3.11 и новее. К статье прилагаются исходники и интерактивный тест.
https://realpython.com/python-async-features/
#python
👉 @python_real
Почему обычная программа простаивает во время сетевых запросов, обращения к базе данных или чтения файлов? И как заставить её выполнять другие задачи, пока она ждёт ответа?
В новом подробном руководстве Real Python асинхронность разбирают постепенно — от синхронного кода и генераторов с yield до полноценной работы с asyncio.
Из материала вы узнаете:
🔹 чем синхронное выполнение отличается от асинхронного;
🔹 что такое блокирующие и неблокирующие операции;
🔹 как устроен цикл событий;
🔹 как работают async, await и корутины;
🔹 как запускать несколько задач через asyncio.TaskGroup;
🔹 почему асинхронность особенно полезна для HTTP-запросов, баз данных и другого I/O;
🔹 как отслеживать состояние выполняющихся задач.
Авторы не просто показывают готовый код, а последовательно создают собственную модель кооперативной многозадачности на генераторах. Благодаря этому становится понятнее, что именно скрывается за работой asyncio.
Примеры рассчитаны на Python 3.11 и новее. К статье прилагаются исходники и интерактивный тест.
https://realpython.com/python-async-features/
#python
👉 @python_real
👍1🔥1
🐍 В Python 3.15 появится
Это встроенный тип для случаев, когда данные должны оставаться неизменными после создания: например, для настроек или результатов вычислений.
Если ключи и значения поддерживают хеширование,
Функция уже описана в PEP 814 https://peps.python.org/pep-0814/) и включена в предварительные версии Python 3.15.
Подробнее в статье https://realpython.com/python315-frozendict/
#python
👉 @python_real
frozendict - словарь, который нельзя изменитьЭто встроенный тип для случаев, когда данные должны оставаться неизменными после создания: например, для настроек или результатов вычислений.
settings = frozendict(theme="dark", language="ru")
print(settings["theme"]) # dark
settings["theme"] = "light" # TypeError
Если ключи и значения поддерживают хеширование,
frozendict можно использовать как ключ другого словаря или элемент множества. Но есть нюанс: неизменяемость не распространяется на вложенные объекты. Если внутри лежит список, его содержимое всё ещё можно менять.Функция уже описана в PEP 814 https://peps.python.org/pep-0814/) и включена в предварительные версии Python 3.15.
Подробнее в статье https://realpython.com/python315-frozendict/
#python
👉 @python_real
👍2
📊 Статистика в Python: с чего начать анализ данных
Среднее значение может скрыть важную деталь. Возьмём числа
В подробном руководстве Real Python разбирают, как описывать данные с помощью Python:
• находить среднее, медиану и моду;
• измерять разброс значений и изучать корреляцию;
• работать с выбросами и пропущенными значениями;
• строить гистограммы, диаграммы и другие графики.
Для небольших задач хватит встроенного модуля
Пример для быстрого старта:
https://realpython.com/python-statistics/
#python
👉 @python_real
Среднее значение может скрыть важную деталь. Возьмём числа
1, 2, 3, 4, 100: среднее равно 22, а медиана — 3. Одно большое значение сильно изменило картину.В подробном руководстве Real Python разбирают, как описывать данные с помощью Python:
• находить среднее, медиану и моду;
• измерять разброс значений и изучать корреляцию;
• работать с выбросами и пропущенными значениями;
• строить гистограммы, диаграммы и другие графики.
Для небольших задач хватит встроенного модуля
statistics. Для массивов, таблиц и визуализации пригодятся NumPy, pandas, SciPy и Matplotlib.Пример для быстрого старта:
from statistics import mean, median
data = [1, 2, 3, 4, 100]
print(mean(data)) # 22
print(median(data)) # 3
https://realpython.com/python-statistics/
#python
👉 @python_real
👍1