Все самое полезное для питониста в одном канале. Список наших каналов: https://t.me/proglibrary/9197 Учиться у нас: https://proglib.io/w/d7f1e6ed Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising
🆕 Появился ty — молниеносный type checker для Python на Rust
Разработчики представили ty — новый инструмент для проверки типов и language server для Python, написанный на Rust. Обещают высокую скорость и удобство интеграции с редакторами.
⚠️ Пока что это pre-release:
— баги,
— отсутствующие фичи,
— возможны критические ошибки.
ty ещё не готов к продакшну, но активно развивается. Инструмент уже вызывает интерес у сообщества — особенно за счёт скорости и амбиций.
👀 Следим за развитием: https://clc.to/1jvRfg
Библиотека питониста #свежак
✉️ Вопросы подписчиков: какой ваш Python-стек в 2025 году
Сегодня делимся вопросом от подписчика, который интересуется, какие инструменты для Python наиболее актуальны в 2025 году.
💬 Вот что он пишет:
«Я использую VSCode и ChatGPT/Sonnet3.5, когда занимаюсь разработкой ML-решений или оптимизацией в ассемблере/CUDA. Однако ограничивающим фактором является то, что в большинстве случаев ИИ работает на уровне младшего разработчика. Поэтому мне часто приходится проверять информацию в документации и на Google.
Какие IDE и инструменты для ноутбуков вы используете в 2025 году? Например, VS Code, Jupyter, PyCharm — что лучше подходит для работы с данными и ML?
Используете ли вы ИИ-инструменты, такие как Cursor, Copilot или Cline? Если да, то какие задачи они помогают решать в вашем рабочем процессе?»
🤔
Библиотека питониста #развлекалово
🏗 7 архитектурных паттернов, которые должен знать каждый программист
Хочешь писать код, который не разваливается через полгода? Понимание архитектурных паттернов — ключ к стабильным и масштабируемым приложениям.
📌 Мы собрали 7 базовых подходов, которые должен знать каждый разработчик. Подходит для тех, кто хочет прокачать архитектурное мышление, уверенно проходить собеседования и строить проекты «на вырост».
👉 Ссылка на статью: https://clc.to/tgproglibacademy6
Библиотека питониста
⌨️ Топ-вакансий для питонистов за неделю
Junior Python Developer (Data) — до 200 000, удалёнка
Team Lead (Python) команды разработки — от 350 000 до 450 000 ₽, удалёнка (Москва)
Junior Python developer — от 100 000 до 130 000 ₽, офис (Москва)
Python разработчик, гибрид (Москва, Санкт-Петербург)
Программист Python junior — от 100 000 ₽, гибрид (Москва)
➡️ Еще больше топовых вакансий — в нашем канале Python jobs
Библиотека питониста
Что представляют собой генераторы в Python, как функционирует метод send() в этих генераторах и каким образом его можно применять для управления их поведением?
Генераторы в Python представляют собой функции, которые применяют оператор yield для возврата значений и временной приостановки выполнения. С помощью метода send() можно отправлять данные обратно в генератор, которые затем могут быть использованы при следующем возобновлении его работы. Это делает генераторы двусторонними, позволяя не только получать значения, но и передавать данные внутрь.
📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих»
Мы написали и собрали для вас в одну подборку все 25 глав и 230 практических заданий!
🐍 Часть 1: Особенности, сферы применения, установка, онлайн IDE
🐍 Часть 2: Все, что нужно для изучения Python с нуля – книги, сайты, каналы и курсы
🐍 Часть 3: Типы данных: преобразование и базовые операции
🐍 Часть 4: Методы работы со строками
🐍 Часть 5: Методы работы со списками и списковыми включениями
🐍 Часть 6: Методы работы со словарями и генераторами словарей
🐍 Часть 7: Методы работы с кортежами
🐍 Часть 8: Методы работы со множествами
🐍 Часть 9: Особенности цикла for
🐍 Часть 10: Условный цикл while
🐍 Часть 11: Функции с позиционными и именованными аргументами
🐍 Часть 12: Анонимные функции
🐍 Часть 13: Рекурсивные функции
🐍 Часть 14: Функции высшего порядка, замыкания и декораторы
🐍 Часть 15: Методы работы с файлами и файловой системой
🐍 Часть 16: Регулярные выражения
🐍 Часть 17: Основы скрапинга и парсинга
🐍 Часть 18: Основы ООП – инкапсуляция и наследование
🐍 Часть 19: Основы ООП – абстракция и полиморфизм
🐍 Часть 20: Графический интерфейс на Tkinter
🐍 Часть 21: Основы разработки игр на Pygame
🐍 Часть 22: Основы работы с SQLite
🐍 Часть 23: Основы веб-разработки на Flask
🐍 Часть 24: Основы работы с NumPy
🐍 Часть 25: Основы анализа данных с Pandas
😆
Библиотека питониста #развлекалово
🔰 Модуль enum: обзор
Модуль enum
в Python используется для создания перечислений — объектов, которые упрощают работу с группами связанных константных значений. Это полезно для удобного различия значений без привязки к их конкретным значениям, например, при работе с параметрами конфигурации.
🟠 Создание перечислений с Enum
и auto
Перечисления позволяют избежать ошибок с опечатками и делают код более читаемым.
Пример с конкретными значениями:
from enum import Enum
class TempUnit(Enum):
CELSIUS = "celsius"
FAHRENHEIT = "fahrenheit"
def get_temperature(city, unit):
return 18.0 if unit == TempUnit.CELSIUS else 64.4
print(get_temperature("Lisbon", TempUnit.CELSIUS)) # 18.0
print(TempUnit.CELSIUS.name) # CELSIUS
print(TempUnit.CELSIUS.value) # celsius
auto()
для автоматической нумерации:from enum import Enum, auto
class Weekday(Enum):
SUNDAY = auto()
MONDAY = auto()
TUESDAY = auto()
WEDNESDAY = auto()
THURSDAY = auto()
FRIDAY = auto()
SATURDAY = auto()
StrEnum
:from enum import StrEnum
class TempUnit(StrEnum):
CELSIUS = "celsius"
FAHRENHEIT = "fahrenheit"
print(TempUnit.CELSIUS.capitalize()) # Celsius
from enum import StrEnum, auto
class TempUnit(StrEnum):
CELSIUS = auto()
FAHRENHEIT = auto()
assert TempUnit.CELSIUS.value == "celsius"
IntEnum
:from enum import IntEnum
class SomeIntegers(IntEnum):
ONE = 1
TWO = 2
THREE = 3
print(SomeIntegers.TWO + 1) # 3
Flag
для комбинирования флагов:from enum import Flag, auto
class NotificationMethod(Flag):
IN_APP = auto()
PUSH = auto()
EMAIL = auto()
SMS = auto()
user_settings = NotificationMethod.IN_APP | NotificationMethod.PUSH
print(user_settings) # <NotificationMethod.IN_APP|PUSH: 3>
@unique
:from enum import Enum, unique
@unique
class EnumWithAliases(Enum):
ONE = 1
TWO = 2
THREE = 3
UNO = 1 # Ошибка, дублирующее значение
@verify(CONTINUOUS)
:from enum import Enum, verify, CONTINUOUS
@verify(CONTINUOUS)
class Nums(Enum):
THREE = 3
FOUR = 4
FIVE = 5
SIX = 6
@verify(CONTINUOUS)
class NumsHole(Enum):
THREE = 3
FOUR = 4
SIX = 6 # Ошибка, отсутствует 5
🐍 Python 3.15 — расписание релиза (PEP 790)
📅 Этапы разработки:
— Начало разработки: 6 мая 2025
— Альфа-релизы:
📝 Alpha 1: 14 октября 2025
📝 Alpha 2: 18 ноября 2025
📝 Alpha 3: 16 декабря 2025
📝 Alpha 4: 13 января 2026
📝 Alpha 5: 10 февраля 2026
📝 Alpha 6: 10 марта 2026
📝 Alpha 7: 7 апреля 2026
— Бета-релизы (без добавления новых фич):
📝 Beta 1: 5 мая 2026
📝 Beta 2: 26 мая 2026
📝 Beta 3: 16 июня 2026
📝 Beta 4: 14 июля 2026
— Release candidates:
📝 RC1: 28 июля 2026
📝 RC2: 1 сентября 2026
— Финальный релиз: 1 октября 2026 (четверг)
🔧 Срок поддержки:
📝 Bugfix-обновления: каждые ~2 месяца в течение 2 лет (до выхода Python 3.18.0 final)
📝 Обновления безопасности (только исходный код): ещё 3 года — до октября 2031
Библиотека питониста #свежак
⌨️ Как адаптировать код под синтаксические изменения в Python 3.14
Python 3.14 планируется к релизу 7 октября 2025 года. В нем будут представлены значительные улучшения производительности, включая новый экспериментальный интерпретатор и оптимизацию различных встроенных модулей.
Кроме того, Python 3.14 вводит несколько изменений синтаксиса, которые важно учитывать разработчикам:
1⃣ Запрещены операторы управления потоком в блоках `finally`
Сейчас разработчики могут по ошибке использовать операторы управления потоком (такие как return
, break
или continue
) в блоках finally
, что может привести к неожиданному поведению. В Python 3.14 будет выводиться SyntaxWarning при наличии таких операторов в блоках finally
.
Пример:
def return_example():
try:
print("В блоке try")
return "Возврат из блока try"
except Exception as e:
print(f"Ошибка: {e}")
finally:
print("В блоке finally")
return "Возврат из блока finally" # Перекрывает возврат из try
result = return_example()
print(f"Результат: {result}")
В блоке try
В блоке finally
Результат: Возврат из блока finally
finally
перезаписывает поток из блоков try/except
.as
для захвата экземпляра исключения.def divide(a, b):
try:
result = a / b
return result
except ZeroDivisionError, TypeError: # Обработка без скобок
print(f"Неправильный ввод: {a} и {b}")
raise
def divide(a, b):
try:
result = a / b
return result
except (ZeroDivisionError, TypeError) as e:
print(f"Ошибка: {e}")
raise e
NameError
. Разработчики должны были использовать строковые литералы или импортировать __future__
, чтобы избежать этой проблемы. В Python 3.14 аннотации типов теперь оцениваются только по мере необходимости.class Node:
def __init__(self, value: int, next: Node): # Ошибка NameError
self.value = value
self.next = next
class Node:
def __init__(self, value: int, next: Node): # Работает без ошибок
self.value = value
self.next = next
📱 Новый ассистент Python-разработки — всего один промпт
Промпт, который превратит ChatGPT в полноценного помощника при решении инженерных задач, отладки и проектирования архитектуры.
✍️ Промпт:
Act as a senior Python developer.
I will describe a project or task I'm working on. You will ask clarifying questions if needed, then help me:
— design clean architecture,
— identify edge cases,
— suggest libraries, tools, and testing strategies,
— write well-structured, production-ready code.
Please explain your reasoning and best practices throughout. Wait for my input before continuing to the next step.
🔥 IT Breaking Memes — 30 000 ₽ за самую смешную IT-новость
Библиотека программиста запускает конкурс, который взорвет вашу ленту: создайте самую смешную альтернативную версию реальной IT-новости!
👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.
🏆 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе
Пример:
Реальная новость: «Гугл создала модель для общения с дельфинами».
Смешная альтернатива: «Нейросеть от Гугл обрабатывает видеопоток с камеры в свинарнике. ИИ следит, сколько свинья находится возле кормушки, не отталкивают ли ее собратья. Недокормленных докармливают, а переевшие пропускают следующую кормешку».
📅 Сроки: с 29 апреля по 11 мая включительно
Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8
Ждем ваших новостей!
☀️ IT-календарь: главные релизы и события мая
📅 Важные релизы:
• Python 3.14 Beta 1
Ожидаемая дата: 6 мая 2025 года
Это важный этап разработки: после выхода беты новые функции замораживаются, а основное внимание переключается на тестирование и исправление ошибок.
• Python 3.13.4
Ожидаемая дата: вероятно, середина месяца
Релиз будет включать исправления багов и обновления безопасности в рамках регулярного двухмесячного цикла.
🌟 Ключевые мероприятия:
• PyCon US 2025 (PyCon US)
Даты проведения: 15–23 мая 2025 года
Место: Питтсбург, США
Крупнейшая конференция Python в США, объединяющая доклады, мастер-классы, хакатоны, ярмарку вакансий (Job Fair), аукцион PyLadies и другие мероприятия для разработчиков всех уровней.
• PyCon Italia 2025 (PyCon Italia)
Даты проведения: 28–31 мая 2025 года
Место: Болонья, Италия
Конференция Python в Италии с насыщенной программой: доклады, мастер-классы и социальные мероприятия — PyDrinks, PyDinner и PyFest.
Библиотека питониста #свежак
Релиз pip 25.1: установка групп зависимостей и вывод lock-файлов
На выходных вышел pip 25.1.
Главные новшества:
➡️ Теперь можно устанавливать группы зависимостей, например:
pip install --group test
pip lock requests -o -
🎙 Что послушать: Developer Trends 2025
Новый выпуск подкаста Talk Python to Me посвящён главным трендам 2025 года:
➡️ какие технологии на подъёме,
➡️ что показывает последний опрос Stack Overflow,
➡️ и куда движется Python-сообщество.
📌 Темы:
— Стоит ли изучать новые базы данных или это хайп?
— Что теряет актуальность?
— Как поменялись роли разработчиков и ожидания в индустрии?
▶️ Слушать: https://clc.to/4neIiA
Библиотека питониста #буст
🔵 11 устаревших Python-модулей, которые следует больше не использовать, и их современные аналоги
Использование старых модулей может привести к неожиданным ошибкам в проектах.
Вот 11 устаревших Python-модулей и их современные аналоги:
1️⃣ Pipes (удален с Python 3.13)
Модуль pipes
был удален, так как был заменен более мощным и кросс-платформенным модулем subprocess
.
import subprocess
result = subprocess.run("echo Hello | tr a-z A-Z", shell=True, capture_output=True, text=True)
print(result.stdout) # HELLO
Text
был предназначен для совместимости с Python 2, и теперь его можно заменить на str
.def greet(name: str) -> str:
return f"Hello, {name}!"
urllib
устарел для работы с HTTP-запросами. Вместо него лучше использовать requests
или urllib3
.import requests
response = requests.post('https://httpbin.org/post', json={'name': 'Yang'})
print(response.json())
crypt
устарел и его заменил более безопасный модуль bcrypt
для хеширования паролей.import bcrypt
password = b"strongpassword"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
typing
.def func(x: list[int]) -> dict[str, int]:
return {}
%
или .format()
устарело. Современный способ — это f-строки.name = "Yang"
print(f"My name is {name}.")
cgi
устарел и заменен современными фреймворками для веб-разработки, такими как Flask
или FastAPI
.ossaudiodev
устарел, и для работы с аудио рекомендуется использовать такие модули, как pyaudio
или sounddevice
.pickle
может быть опасным для использования, так как есть риски выполнения вредоносного кода. Для безопасной сериализации лучше использовать json
.import json
data = {"name": "Yang"}
with open('data.json', 'w') as f:
json.dump(data, f)
asyncio
для асинхронного программирования.random
использует предсказуемый алгоритм, который небезопасен для генерации паролей. Используйте secrets
для криптографически стойких случайных чисел.import secrets
password = secrets.token_hex(16)
👍 Команда дня: contextlib.suppress
Сегодня разберём полезную команду для работы с contextlib.suppress — удобный способ игнорировать определённые исключения без громоздкого try-except.
from contextlib import suppress
# Игнорируем FileNotFoundError при удалении файла
with suppress(FileNotFoundError):
import os
os.remove("non_existent_file.txt")
data = {"name": "Alice"}
with suppress(KeyError):
print(data["age"]) # Не сломается, даже если ключа "age" нет
🔰 How to: как сделать логические выражения в Python читаемыми
Длинные логические выражения — бич читаемости. Вот простой пример:
if user["verified"] and event["date"] > datetime.now() and not event["full"]:
print("Here's the event signup form...")
if (user["verified"]
and event["date"] > datetime.now()
and not event["full"]):
print("Here's the event signup form...")
and
, or
) в начале строки.user_is_verified = user["verified"]
event_in_future = event["date"] > datetime.now()
event_not_full = not event["full"]
if user_is_verified and event_in_future and event_not_full:
print("Here's the event signup form...")
def is_verified(user): return user["verified"]
def in_future(event): return event["date"] > datetime.now()
def not_full(event): return not event["full"]
if is_verified(user) and in_future(event) and not_full(event):
print("Here's the event signup form...")
not (a or b)
— можно применить трансформацию:# Было:
not (a or b)
# Стало:
not a and not b
def can_only_read(user):
return not (
user["role"] == "admin"
or "edit" in user["permissions"]
)
def can_only_read(user):
return user["role"] != "admin" and "edit" not in user["permissions"]
🔥 Конкурс: 30 000 ₽ за самую смешную IT-новость
Напоминаем о конкурсе «Библиотеки программиста»: напишите самую смешную версию реальной новости про технологии.
👾 Правила просты:
1. Берете настоящую новость из мира технологий.
2. Переписываете ее так, чтобы смеялись все.
3. Получаете деньги и славу.
🎁 Призы:
- 1 место: 30 000 ₽ + статус ведущего нового юмористического IT-канала
- 2 и 3 место: по 5 000 ₽ + вечный почет в IT-сообществе
🏆 Как будем оценивать:
Мы выложим новости всех участников в одном из наших телеграм-каналов. Те новости, которые наберут больше всего охвата, войдут в шорт-лист. Из шорт-листа подписчики и жюри выберут победителя.
📅 Сроки: прием новостей до 11 мая включительно
Для участия отправьте свою смешную новость в гугл-форму: https://forms.gle/6YShjgfiycfJ53LX8
Осталась неделя — ждем ваших новостей!
📱 Python новости
🚀 Релизы и инструменты:
— pip 25.1— поддержка групп зависимостей и вывод lock-файлов
— Python 3.15: расписание релиза (PEP 790) — важные даты и этапы разработки
— PyCharm стал единым продуктом — что изменилось для разработчиков
— AutoKitteh — гибкая альтернатива Zapier и n8n для автоматизации
— Django Action Triggers — триггеры действий прямо в Django
— IT-календарь: релизы и события мая — чтобы ничего не пропустить
👍 Советы:
— Как запускать Python в проде — практики деплоя и окружения
— Как я строю инфраструктуру вокруг Python-проектов — линтеры, Poetry, CI/CD и Docker
— Управление памятью в Python — когда и зачем вмешиваться вручную
— 14 интересных фич Python — полезные, хоть и не всегда pythonic
📚 Библиотека питониста #свежак
🔎 Wordsearch: узнаем, кто самый внимательный
Готовы проверить свои знания в Python? В этой головоломке спрятаны термины из мира программирования.
Правила просты:
— Найдите все слова в сетке (слова идут по горизонтали)
— Напишите в комментариях, какие слова вы нашли
— Объясните один из терминов так, чтобы даже джун понял
🏆 Первый, кто найдёт все слова и объяснит хотя бы один термин, получит почётный статус Python Guru на неделю!
Прячем ответы под спойлер, чтобы не спалить остальным.
Погнали 👇
Библиотека питониста #междусобойчик
🎓 Как выбрать свою роль в Data Science и не потеряться в терминах
Если вы только начинаете разбираться в Data Science — перед вами лабиринт из названий: data scientist, аналитик, ML-инженер, BI, архитектор... Кто чем занимается? Что нужно учить?
➡️ Что внутри статьи
— Кто такие Data Engineer
— Чем отличается Data Architect от инженера и зачем он нужен в big data проектах
— Чем занимаются Data Analyst и почему это отличная точка входа в карьеру
— Что делает настоящий Data Scientist
В статье разобрано всё: от задач до технологий, которые реально спрашивают на собеседованиях.
📎 Ссылка
Азбука айтишника #ликбез
🔥 Холивар: Flask vs Django vs FastAPI
🧑💻 Начинающий разработчик:
«Хочу выбрать фреймворк, чтобы изучать бэкенд на Python. Что лучше начать: Flask, Django или FastAPI?»
🤯 Как простая задачка поставила в тупик программистов
На собеседовании задали простой вопрос:
«В мешке числа от 1 до 100. Одно пропало. Как найти его? А если пропали два числа? Три? Или вообще k чисел?»
Библиотека питониста #развлекалово
Читать полностью…🐍✨ Пиши как профи: 10 Python-лайфхаков для новичков
Лайфхаки от разработчиков, обжёгшихся до вас
➡️ Что вас ждет внутри:
— почему if x == True: — это преступление
— как списковые включения экономят часы
— зачем линтер важнее кофе
— и почему def func(start_list=[]) может испортить тебе вечер
— как не сойти с ума от зависимостей (и что делать с виртуальными окружениями)
— секретный power move: dir(), help() и другие встроенные суперсилы
И всё это без занудства и «книг для чайников». Просто, по делу, с примерами и личным опытом от бывалых питонистов
📎 Статья
🔵 Начинайте свой путь в программировании и прокачивайте свои навыки с нашим курсом «Основы программирования на Python»
Proglib Academy #буст
Инструмент недели: планирование задач с Rocketry
Rocketry — это фреймворк для планирования задач в Python, который позволяет легко управлять задачами и их выполнением с помощью простых выражений.
👇 В этом посте мы покажем, как быстро настроить планировщик задач, используя Rocketry.
1⃣ Установите Rocketry
Для начала установите Rocketry с помощью pip:
pip install rocketry
scheduler.py
, и добавьте в него следующий код:from rocketry import Rocketry
from rocketry.conds import daily
app = Rocketry()
@app.task(daily)
def do_daily():
print("Эта задача выполняется каждый день!")
if __name__ == '__main__':
app.run()
python scheduler.py
@app.task(every("10 seconds"))
def do_continuously():
print("Эта задача выполняется каждую секунду!")
@app.task(daily.after("07:00"))
def do_daily_after_seven():
print("Эта задача выполняется каждый день после 7:00!")
@app.task(hourly & time_of_day.between("22:00", "06:00"))
def do_hourly_at_night():
print("Эта задача выполняется каждый час ночью!")
@app.task(cron("* 2 * * *"))
def do_based_on_cron():
print("Эта задача выполняется по cron-выражению!")
from rocketry.conds import daily, after_success
from rocketry.args import Return
@app.task(daily.after("07:00"))
def do_first():
return 'Hello World'
@app.task(after_success(do_first))
def do_second(arg=Return('do_first')):
print(f"Задача 'do_first' вернула: {arg}")
return 'Hello Python'
@app.task(daily, execution="main")
def do_unparallel():
print("Эта задача выполняется синхронно.")
@app.task(daily, execution="async")
async def do_async():
print("Эта задача выполняется асинхронно.")
@app.task(daily, execution="thread")
def do_on_separate_thread():
print("Эта задача выполняется в отдельном потоке.")
@app.task(daily, execution="process")
def do_on_separate_process():
print("Эта задача выполняется в отдельном процессе.")
⌨️ Топ-вакансий для питонистов за неделю
Python-разработчик — от 300 000 ₽, удалёнка
Senior Python Developer (KernelCare), удалёнка
Python-разработчик, удалёнка
Python Developer — от 220 000 ₽, удалёнка
Junior Python developer — от 100 000 до 130 000 ₽, офис (Москва)
➡️ Еще больше топовых вакансий — в нашем канале Python jobs
Библиотека питониста
Есть ли в Python сборщик мусора, и, если есть, как он работает?
Стандартный интерпретатор использует несколько алгоритмов.
🧹 Подсчёт ссылок. Каждый объект в Python содержит внутренний счётчик ссылок. Когда он падает до нуля, это означает, что на объект больше нет ссылок, его можно удалить. Главный недостаток этого алгоритма — не умеет определять циклические ссылки.
🧹 Алгоритм поиска циклов. Реализован в модуле gc и активируется время от времени, а не постоянно. Если коротко, этот алгоритм периодически ищет объекты, которые ссылаются только друг на друга и не доступны извне. Объекты, признанные недостижимыми, удаляются.
Также стоит добавить, что циклический сборщик мусора делит объекты на три поколения в зависимости от того, как долго они существуют в памяти. Новые объекты помещаются в первое поколение. Если они сохраняются после очередного процесса сбора мусора, то перемещаются в следующее по старшинству поколение. Объекты в более старших поколениях проверяются реже.