Zen of Python
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL
Больше📈 Аналитический обзор Telegram-канала Zen of Python
Канал Zen of Python (@zen_of_python) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 18 957 подписчиков, занимая 6 776 место в категории Технологии и приложения и 34 770 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 18 957 подписчиков.
Согласно последним данным от 26 августа, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -168, а за последние 24 часа — -9, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 10.58%. В первые 24 часа после публикации контент обычно набирает 6.33% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 2 005 просмотров. В течение первых суток публикация набирает 1 200 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 5.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как github, rust, pip, api, install.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Полный Дзен Пайтона в одном канале
Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site
Регистрация в перечне РКН: https://tprg.ru/xZOL”
Благодаря высокой частоте обновлений (последние данные получены 27 августа, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
@task позволяет превращать любую функцию в асинхронное задание.
🔘 ImmediateBackend — выполняет задачу сразу (удобно для разработки)
🔘 DummyBackend — добавляет задачу в очередь, но не исполняет (для тестирования логики)
В будущем планируются интеграции с реальными брокерами (Postgres, Redis, RabbitMQ).
Template Partials: переиспользуемые компоненты
Фронтенд-разработчикам понравится. Новый механизм partials:
🔘 Позволяет определять фрагменты шаблона через partialdef;
🔘 Поддерживает параметры и повторное использование в циклах и разных местах страницы;
🔘 Устраняет дублирование кода, упрощает дизайн-системы на Django Templates.
Это шаг в сторону компонентного подхода, знакомого пользователям React / Vue, но в экосистеме Django.
Другие изменения
🔘 В циклах теперь можно использовать forloop.length, чтобы узнать размер итерации (ранее были только forloop.counter, forloop.first, forloop.last и т.п.)
🔘 Более корректная работа с Unicode, MIME-типами и вложениями в емейлах;
🔘 Обновления для PostgreSQL и других баз данных;
🔘 Традиционные улучшения производительности и совместимости;
🔘 Альфа-релиз означает feature freeze: новые возможности добавлены, впереди тестирование и исправление багов.
#факт
@zen_of_pythontyping в более поздних версиях Python, либо являются экспериментальными и ещё не включены в стандарт.
Тот случай, когда переходить на новую версию языкового пакета нет желания, а использовать новую фичу есть.
#инструмент
@zen_of_python
class XMLImporter:
def __init__(self, filename):
self.filename = filename
def execute(self):
print("XML imported from", self.filename)
class JSONImporter:
def __init__(self, filename):
self.filename = filename
def execute(self):
print("JSON imported from", self.filename)
class Document:
def import_file(self, filename):
if filename.endswith(".xml"):
importer = XMLImporter(filename)
elif filename.endswith(".json"):
importer = JSONImporter(filename)
data = importer.execute()
document = Document()
document.import_file("text.xml")
document.import_file("text.json")
На первый взгляд код рабочий, но здесь нарушаются два принципа SOLID:
1️⃣ Принцип единственной ответственности (Single Responsibility Principle): класс Document отвечает сразу за создание объектов XMLImporter, JSONImporter и их использование.
2️⃣ Принцип открытости / закрытости (Open / Closed Principle).
Если появится новый формат (например, CSV), придётся снова лезть в метод import_file и расширять блок if / elif.
Решение: фабрика
Чтобы убрать ответственность за создание объектов из класса Document, вводится так называемася фабрика. Это объект, который берёт на себя ответственность за создание других объектов. Она не избавляет нас полностью от изменения кода при добавлении новых форматов, но значительно улучшает читаемость, гибкость и расширяемость системы.
class ImporterFactory:
def get_importer(self, filename):
if filename.endswith(".xml"):
return XMLImporter(filename)
elif filename.endswith(".json"):
return JSONImporter(filename)
Теперь Document больше не знает, как именно создаются нужные классы. Ему просто передают готовую фабрику:
class Document:
def __init__(self, factory):
self.factory = factory
def import_file(self, filename):
importer = self.factory.get_importer(filename)
data = importer.execute()
factory = ImporterFactory()
document = Document(factory)
document.import_file("text.xml")
document.import_file("text.json")
Преимущества фабрики
1️⃣ Изоляция ответственности: логика создания объектов теперь сосредоточена только в одном месте — в ImporterFactory.
2️⃣ Гибкость: если нужно добавить поддержку нового формата (CSV, YAML и т.д.), достаточно изменить фабрику, не трогая Document.
3️⃣ Удобное тестирование: в тестах можно подменить фабрику на «фиктивную» (mock) и проверять работу Document независимо от импортеров.
Что дальше?
Фабрика — это базовый паттерн. На его основе строятся более сложные подходы, например:
🔘 Factory Method — когда создание объектов делегируется подклассам.
🔘 Abstract Factory — когда фабрика создаёт целые семейства объектов, согласованных между собой.
#основы
@zen_of_python"...");
🔘 Логические значения — в нижнем регистре: true / false (в Python — True / False);
🔘 Отсутствующее значение — null (в Python → None);
🔘 Нельзя оставлять комментарии и нельзя ставить завершающие запятые после последнего элемента.
Валидный JSON:
{
"name": "Frieda",
"isDog": true,
"hobbies": ["eating", "sleeping"],
"age": 8,
"address": {"home": ["Berlin", "Germany"], "work": null}
}
Модуль json
Главные функции одноименного модуля стандартной библиотеки:
🔘 json.dumps(obj, **opts) — сериализует Python-объект в строку JSON;
🔘 json.dump(obj, fp, **opts) — сериализует и записывает в файл-объект;
🔘 json.loads(s) — парсит JSON-строку в Python-объект;
🔘 json.load(fp) — считывает JSON из файла и парсит.
Эти функции следуют стандартному отображению типов: словари → объекты, списки → массивы, строки → строки, числа → числа, True / False → true / false, None → null.
import json
data = {"name": "Frieda", "age": 8, "is_dog": True}
s = json.dumps(data) # --> '{"name": "Frieda", "age": 8, "is_dog": true}'
obj = json.loads(s) # --> {'name': 'Frieda', 'age': 8, 'is_dog': True}
Полезные параметры dumps / dump
При сериализации полезны параметры:
🔘 indent — делает вывод читабельным (pretty print) (например, indent=2);
🔘 sort_keys=True — сортирует ключи объекта по алфавиту;
🔘 separators — позволяет контролировать символы между элементами (полезно для минификации);
🔘 ensure_ascii=False — по умолчанию json экранирует не-ASCII символы; если хотите сохранить UTF-8 в читаемом виде, ставьте False;
🔘 skipkeys=True — пропускает неподдерживаемые типы ключей вместо TypeError (использовать осторожно — вы можете потерять данные).
Маппинг типов
При загрузке JSON в Python выполняется обратное отображение типов:
* object → dict
* array → list
* string → str
* number → int / float
* true`/`false → True`/`False
* null → None
JSON-ключи — всегда строки. Если у вас в исходном Python-словаре были числовые ключи (например {1: "a"}`), при сериализации они станут строками (`"1"`). После `json.loads() вы получите ключи как строки — Python не "угадает" исходный тип. Это частая ловушка при конвертации словарей ключами-числами.
Полезные утилиты и приёмы
🔘 python -m json.tool — встроенная утилита для форматирования/проверки JSON в терминале (можно использовать для prettify/minify);
🔘 Онлайн-валидаторы (например, JSONLint) и редакторы с подсветкой помогут быстро найти синтаксические ошибки (комментарии, лишние запятые и т. п.).
Подборка примеров
Читаем JSON из файла:
import json
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
Записываем с красивым форматированием:
with open("data_pretty.json", "w", encoding="utf-8") as f:
json.dump(data, f, indent=2, sort_keys=True, ensure_ascii=False)
Сериализуем datetime:
from datetime import datetime
import json
def default(o):
if isinstance(o, datetime):
return o.isoformat()
raise TypeError
json.dumps({"now": datetime.utcnow()}, default=default)
Проверяем валидность JSON в CLI
python -m json.tool input.json > /dev/null
# код возврата 0 — валидный JSON
#основы
@zen_of_python
class XMLImporter:
def __init__(self, filename):
self.filename = filename
def execute(self):
print("XML imported from", self.filename)
class JSONImporter:
def __init__(self, filename):
self.filename = filename
def execute(self):
print("JSON imported from", self.filename)
class Document:
def import_file(self, filename):
if filename.endswith(".xml"):
importer = XMLImporter(filename)
elif filename.endswith(".json"):
importer = JSONImporter(filename)
data = importer.execute()
document = Document()
document.import_file("text.xml")
document.import_file("text.json")
На первый взгляд код рабочий, но здесь нарушаются два принципа SOLID:
1️⃣ Принцип единственной ответственности (Single Responsibility Principle): класс Document отвечает сразу за две вещи:
🔘 создание объектов XMLImporter, JSONImporter;
🔘 их использование.
2️⃣ Принцип открытости/закрытости (Open / Closed Principle).
Если появится новый формат (например, CSV), придётся снова лезть в метод import_file и расширять блок if / elif.
Решение: фабрика
Чтобы убрать ответственность за создание объектов из класса Document, вводится так называемася фабрика.
class ImporterFactory:
def get_importer(self, filename):
if filename.endswith(".xml"):
return XMLImporter(filename)
elif filename.endswith(".json"):
return JSONImporter(filename)
Теперь Document больше не знает, как именно создаются нужные классы. Ему просто передают готовую фабрику:
class Document:
def __init__(self, factory):
self.factory = factory
def import_file(self, filename):
importer = self.factory.get_importer(filename)
data = importer.execute()
factory = ImporterFactory()
document = Document(factory)
document.import_file("text.xml")
document.import_file("text.json")
Преимущества фабрики
1️⃣ Изоляция ответственности: логика создания объектов теперь сосредоточена только в одном месте — в ImporterFactory.
2️⃣ Гибкость: если нужно добавить поддержку нового формата (CSV, YAML и т.д.), достаточно изменить фабрику, не трогая Document.
3️⃣ Удобное тестирование: в тестах можно подменить фабрику на «фиктивную» (mock) и проверять работу Document независимо от импортеров.
Что дальше?
Фабрика — это базовый паттерн. На его основе строятся более сложные подходы, например:
🔘 Factory Method — когда создание объектов делегируется подклассам.
🔘 Abstract Factory — когда фабрика создаёт целые семейства объектов, согласованных между собой.
#основы