Модуль 2 · Урок 7 із 58
Умови, truthiness і безпечні рішення
Умова — це реалізація рішення, тому її треба читати як правило: які факти входять, у якому порядку перевіряються й який результат очікується на межах. Вчимося будувати прозорі гілки, а не складні вирази, правильність яких видно лише автору.
Безпечна практика модуля 2
Пакет містить тільки синтетичний rule router, decision table та локальні tests. Жодних реальних звернень, персональних даних, secrets, мережевих викликів або зовнішніх залежностей.
Порівняння й identity
== порівнює значення, != перевіряє нерівність, а is — identity двох посилань. Для None використовуйте is None; для рядків і чисел — порівняння значень. Ланцюжок 5 <= minutes <= 240 читається як одна межа й обчислює середній operand один раз.
minutes = 45
topic = "python"
reviewer = None
print(5 <= minutes <= 240) # True
print(topic == "python") # True
print(reviewer is None) # TrueTruthiness — зручно, але стани не можна зливати бездумно
У condition false-like є False, None, числовий нуль і порожні колекції або рядки. Інші значення зазвичай truthy. Тому if value: корисне, коли правило справді означає «будь-яке непорожнє значення». Якщо нуль і відсутність мають різний сенс, перевіряйте їх окремо.
"true" або "false".and, or, not і short-circuit
and не обчислює праву частину, якщо ліва false-like; or — якщо ліва truthy. Це дозволяє захистити небезпечну операцію, але оператори повертають один зі своїх operands, а не обов’язково bool.
label = " Python "
if label is not None and label.strip():
print(label.strip())
display_name = label.strip() or "Без назви"
print(type(display_name)) # strНе пишіть довгі ланцюжки з прихованими side effects. Якщо правило має три причини відмови, кілька guard clauses зазвичай легше тестувати, ніж один багаторядковий boolean expression.
Порядок if / elif — це пріоритет правил
Python виконує першу гілку з істинною умовою й не перевіряє решту. Отже, більш специфічне або критичне правило має стояти раніше. Нижче блокер має пріоритет над VIP-ознакою.
priority = 4
minutes_open = 95
has_blocker = True
if has_blocker:
route = "urgent"
elif priority >= 4 and minutes_open >= 60:
route = "expedite"
elif priority >= 2:
route = "standard"
else:
route = "backlog"
print(route)Перестановка перших двох гілок може змінити outcome. Decision table до написання коду робить цей пріоритет видимим для reviewer.
Guard clauses зменшують вкладеність
Спочатку відхиліть невідповідні або небезпечні стани, а happy path залиште нижче. У функціях це часто роблять раннім return; функції детально з’являться в модулі 3. Поки тренуйте ту ж форму через послідовні умови та явний status.
label = " "
minutes = 45
if not label.strip():
status = "invalid_label"
elif not 5 <= minutes <= 240:
status = "invalid_duration"
else:
status = "ready"
print(status)Boundary tests важливіші за випадкові приклади
Якщо правило каже priority >= 4 та minutes_open >= 60, перевірте 3/4 і 59/60, а також усі комбінації з blocker. Один happy path не доводить порядок гілок.
None або порожній text як окремий case.Практика: rule router
Побудуйте rule router для синтетичної черги: він отримує priority 1–5, minutes_open, has_blocker і нормалізовану label. Спочатку напишіть decision table, потім код. Заборонено використовувати реальні звернення, ПІБ, email або customer identifiers.
Методичні джерела
- Python: Truth Value Testing and Boolean Operations
- Python tutorial: if Statements
- Python reference: Comparisons
Урок, сценарії, пояснення й вправи створені SEOWORK. Посилання ведуть лише на офіційну документацію Python.
Закріпіть матеріал уроку
Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.