Zen of Python
Полный Дзен Пайтона в одном канале Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Сайт: https://tprg.ru/site Регистрация в перечне РКН: https://tprg.ru/xZOL
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام Zen of Python
تُعد قناة Zen of Python (@zen_of_python) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 19 288 مشتركاً، محتلاً المرتبة 6 972 في فئة التكنولوجيات والتطبيقات والمرتبة 35 079 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 19 288 مشتركاً.
بحسب آخر البيانات بتاريخ 05 يونيو, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار 26، وفي آخر 24 ساعة بمقدار -3، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 12.34%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 5.62% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 2 378 مشاهدة. وخلال اليوم الأول يجمع عادةً 1 082 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 9.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل github, rust, pip, api, install.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Полный Дзен Пайтона в одном канале
Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site
Регистрация в перечне РКН: https://tprg.ru/xZOL”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 06 يونيو, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
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 — когда фабрика создаёт целые семейства объектов, согласованных между собой.
#основыself: простейшее объяснение
Если вы только начинаете изучать Python, то почти наверняка уже столкнулись с self. В этом лонгриде мы разберемся, что это и с чем это едят.
self — это ссылка на объект
Ключевое слово self используется в методах классов. Оно всегда указывает на текущий экземпляр класса, через который происходит обращение к данным и методам.
class Employee:
def set_salary(self, value):
self.salary = value
e = Employee()
e.set_salary(2000)
print(e.salary)
Когда вы создаёте объект, Python автоматически передаёт этот объект первым аргументом в метод. Принято называть его self, хотя технически вы можете использовать любое имя.
🔘 Создаётся класс Employee с методом set_salary. Этот метод принимает два аргумента:
— self — сам объект;
— value — значение, которое мы хотим установить.
🔘 Внутри метода выполняется присваивание:
self.salary = value
Это значит, что у конкретного объекта e создаётся атрибут salary, которому присваивается переданное значение.
🔘 Далее создаём объект:
e = Employee()
🔘 Устанавливаем зарплату:
e.set_salary(2000)
На самом деле Python преобразует этот вызов в:
Employee.set_salary(e, 2000)
🔘 Проверяем результат:
print(e.salary) # 2000
Почему без self не обойтись?
self позволяет объекту хранить собственные данные. Каждый экземпляр класса имеет свой набор атрибутов, и именно через self мы к ним обращаемся.
Например, если создать двух сотрудников:
e1 = Employee()
e2 = Employee()
e1.set_salary(2000)
e2.set_salary(3000)
print(e1.salary) # 2000
print(e2.salary) # 3000
У каждого объекта будет своя зарплата.
#инструмент
@zen_of_python
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
