Zen of Python
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL
Mostrar más📈 Análisis del canal de Telegram Zen of Python
El canal Zen of Python (@zen_of_python) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 18 957 suscriptores, ocupando la posición 6 776 en la categoría Tecnologías y Aplicaciones y el puesto 34 770 en la región Rusia.
📊 Métricas de audiencia y dinámica
Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 18 957 suscriptores.
Según los últimos datos del 26 agosto, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -168, y en las últimas 24 horas de -9, conservando un alto alcance.
- Estado de verificación: No verificado
- Tasa de interacción (ER): El promedio de interacción de la audiencia es 10.58%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 6.33% de reacciones respecto al total de suscriptores.
- Alcance de las publicaciones: Cada publicación recibe en promedio 2 005 visualizaciones. En el primer día suele acumular 1 200 visualizaciones.
- Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 5.
- Intereses temáticos: El contenido se centra en temas clave como github, rust, pip, api, install.
📝 Descripción y política de contenido
El autor describe el recurso como un espacio para expresar opiniones subjetivas:
“Полный Дзен Пайтона в одном канале
Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site
Регистрация в перечне РКН: https://tprg.ru/xZOL”
Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 27 agosto, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.
@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 — когда фабрика создаёт целые семейства объектов, согласованных между собой.
#основы