Python с нуля к первым деньгам за коды
320 subscribers
91 photos
44 videos
154 links
Download Telegram
Что такое assert?

#Python #Assert #Debug #Testing #Программирование #Ошибки

📌 "Assert — твой защитник от скрытых багов. Научись использовать его правильно и делай код надежнее!"

# Синтаксис:
# assert условие, "Сообщение об ошибке"

def divide(a, b):
assert b != 0, "Деление на ноль невозможно!"
return a / b

print(divide(10, 2)) # 5.0
print(divide(10, 0)) # AssertionError: Деление на ноль невозможно!


Суть:
Проверяет условия в режиме отладки.
Автоматически отключается при запуске с флагом -O (оптимизация).


🥸 Знаешь с кем поделиться? 👀📚📃
🔍 Проверка инвариантов в программировании

Инвариант — это условие, которое должно оставаться истинным на протяжении всей работы программы или её части (например, внутри цикла, метода или класса).

assert идеально подходит для проверки инвариантов, так как его задача — обнаруживать нарушения логики кода на ранних этапах.
🎯 Простыми словами:

Это гарантия того, что:

Объект/система находится в корректном состоянии.
Данные соответствуют ожидаемым свойствам.
Логика выполняется без скрытых ошибок.

📌 Примеры инвариантов
1️⃣ Инвариант класса

class BankAccount:
def init(self, balance):
assert balance >= 0, "Баланс не может быть отрицательным" # Инвариант
self.balance = balance

def withdraw(self, amount):
new_balance = self.balance - amount
assert new_balance >= 0, "Недостаточно средств" # Проверка инварианта после изменения
self.balance = new_balance

→ После любых операций баланс должен оставаться >= 0.
2️⃣ Инвариант в цикле

def calculate_factorial(n):
assert n >= 0, "Факториал определён только для n >= 0"
result = 1
for i in range(1, n+1):
result *= i
assert result > 0, "Переполнение или ошибка в вычислениях" # Инвариант цикла
return result

→ Значение result всегда должно быть положительным.
3️⃣ Структурный инвариант данных

def process_users(users):
assert all(isinstance(user, dict) for user in users), "Каждый user должен быть словарём"
assert all("id" in user for user in users), "У всех пользователей должен быть ID"
# Логика обработки...

→ Проверка структуры списка users.
🚀 Почему это важно?

Ловит ошибки сразу — когда нарушается логика программы.
Делает код надёжнее — явно формулирует требования.
Служит документацией — показывает, какие условия критичны для работы.

⚠️ Но: В продакшне инварианты часто заменяют на полноценные исключения (if ... raise ValueError), так как assert отключается при оптимизации.
💡 Идея для поста в Telegram

Хэштеги: #Python #Инварианты #Программирование #ООП #Тестирование #Код

Заголовок:
"Инварианты — стражи вашего кода. Как assert помогает избежать скрытых ошибок?"

Слоган:
"Чем чаще вы проверяете инварианты, тем меньше багов добирается до пользователей (и вашего кошелька)!"

Пример кода:

class Rectangle:
def init(self, width, height):
assert width > 0 and height > 0, "Стороны должны быть положительными"
self.width = width
self.height = height

def area(self):
return self.width * self.height

Обсуждение:
"Какие инварианты вы проверяете в своих проектах? Делитесь в комментариях!"

Знаешь с кем поделиться?
________________________________________
🔥🆙 Содержание В начало 👀🤔
Assert vs Exception

#Python #ОбработкаОшибок #BestPractices #Код #Разработка #Assert

"Assert — для разработчика, Exception — для пользователя. Выбирай инструмент под задачу!"

# Плохо (assert для валидации API):
def set_age(age):
assert age > 0, "Возраст должен быть положительным" # Ненадежно!
# ...

# Хорошо (используйте исключения):
def set_age(age):
if age <= 0:
raise ValueError("Возраст должен быть положительным")

Различие:
• Assert — для отладки (исчезает в продакшне).
• Exception — для обработки ожидаемых ошибок.

Знаешь с кем поделиться?
________________________________________
🔥🆙 Содержание В начало 👀🤔
Продвинутые сценарии с assert

#Python #Automation #Testing #Debugging #Программирование #Код
"Используй assert для сложных проверок — сделай код самодокументируемым!"
def process_data(data):
# Проверка типа и структуры данных
assert isinstance(data, list), "Данные должны быть списком"
assert all(isinstance(x, (int, float)) for x in data), "Элементы должны быть числами"

return [x * 2 for x in data]

print(process_data([1, 2, 3])) # [2, 4, 6]
print(process_data("abc")) # AssertionError

Лайфхаки:
• Комплексные условия с all()/any().
• Проверка типов в прототипах.

Знаешь с кем поделиться?
________________________________________
🔥🆙 Содержание В начало 👀🤔
Ограничения и альтернативы

#Python #BestPractices #Ошибки #Инструменты #Разработка #Тестирование

"Assert — не панацея. Иногда нужны pytest или logging!"
# Когда assert недостаточно:
# 1. Для тестов → pytest
def test_divide():
assert divide(10, 2) == 5.0 # Лучше в рамках pytest/unitest

# 2. Для логирования → logging
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("Проверка: %s", some_value) # Не исчезнет в продакшне


Вывод:
• В продакшне заменяйте assert на:
o pytest — для тестов.
o logging — для диагностики.

Знаешь с кем поделиться?
________________________________________
🔥🆙 Содержание В начало 👀🤔
💡 Как готовят код к продакшну?

Заменяют assert на явные проверки:

# Было (для разработки)
assert user.is_active, "User inactive"

# Стало (для продакшна)
if not user.is_active:
raise ValueError("User inactive")

Убирают debug-логи (или снижают их уровень).
Тестируют на стейджинг-сервере (копия продакшна).
Настраивают мониторинг (логи, алерты).

⚠️ Почему assert опасен в продакшне?

Молчаливые ошибки: При запуске с python -O все assert игнорируются → баги остаются незамеченными.
Неинформативно: В логах будет просто AssertionError без деталей (в отличие от raise ValueError("Описание")).

📢 Пример для Telegram-поста

Хэштеги: #Продакшн #Программирование #DevOps #Безопасность #Python #Код

Заголовок:
"Продакшн — как перестать debug-ить и начать жить"

Слоган:
"Код, который работает у вас на ноутбуке, и код, который вы запускаете в продакшне — это два разных кода!"

Пример:

# Плохо для продакшна
assert payment_successful, "Оплата не прошла"

# Хорошо для продакшна
if not payment_successful:
log.error("Ошибка оплаты: пользователь ID=%s", user_id)
raise PaymentError("Оплата не прошла")

Дискуссия:
Какие самые страшные баги вы ловили в продакшне из-за неправильной подготовки?

Итог: Продакшн — это когда ответственность за код становится реальной, а ошибки стоят денег. Готовьтесь к нему с первого дня разработки!

Знаешь с кем поделиться?
________________________________________
🔥🆙 Содержание В начало 👀🤔