Модуль 2 · Урок 7 із 58

Умови, truthiness і безпечні рішення

Умова — це реалізація рішення, тому її треба читати як правило: які факти входять, у якому порядку перевіряються й який результат очікується на межах. Вчимося будувати прозорі гілки, а не складні вирази, правильність яких видно лише автору.

if / elifTruthinessShort-circuitDecision table

Безпечна практика модуля 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)        # True

Truthiness — зручно, але стани не можна зливати бездумно

У condition false-like є False, None, числовий нуль і порожні колекції або рядки. Інші значення зазвичай truthy. Тому if value: корисне, коли правило справді означає «будь-яке непорожнє значення». Якщо нуль і відсутність мають різний сенс, перевіряйте їх окремо.

if nameПідходить для правила «після strip має лишитися непорожній текст».
is NoneВідрізняє невідоме значення від валідного нуля.
== 0Фіксує саме нуль, не інші false-like об’єкти.
bool(text)Не є parser для слів "true" або "false".
not itemsЧитабельна перевірка порожньої колекції, коли тип уже відомий.
explicit stateДля складного workflow краще окремий status, ніж випадкова комбінація порожніх полів.

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 не доводить порядок гілок.

MinimumЗначення рівно на нижній межі.
BelowНа одиницю нижче межі.
MaximumРівно на верхній межі, якщо вона є.
OverlapОдночасно істинні дві умови — яка має пріоритет?
MissingNone або порожній text як окремий case.
InvariantКритичний blocker ніколи не потрапляє до backlog.

Практика: rule router

Побудуйте rule router для синтетичної черги: він отримує priority 1–5, minutes_open, has_blocker і нормалізовану label. Спочатку напишіть decision table, потім код. Заборонено використовувати реальні звернення, ПІБ, email або customer identifiers.

Методичні джерела

Урок, сценарії, пояснення й вправи створені SEOWORK. Посилання ведуть лише на офіційну документацію Python.

Практична перевірка · урок 7 з 47

Закріпіть матеріал уроку

Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.

1. Optional reviewer відсутній, а нульове числове значення допустиме. Яка умова не змішує ці стани?
2. У rule router одночасно істинні has_blocker і priority >= 4. Яке рішення робить пріоритет правил перевірюваним?
3. Що повертають оператори and та or у Python, якщо operands не обов’язково мають тип bool?