Ефективне налагодження за допомогою оператора Python Assert

| | 0 Comments| 4:29 AM
Categories:

Ви програміст? Якщо так, то налагодження є важливою навичкою, незалежно від мови, якою ви пишете код. У цій статті ви дізнаєтесь, як використовувати оператор assert у Python для ефективного налагодження.

Коли ви працюєте над проектом, ви визначите кілька модулів. Це включає функції, визначення класів тощо. І ви, швидше за все, зіткнетеся з помилками або неочікуваними результатами через помилку в реалізації. Оператори assert корисні для налагодження такого коду.

У цьому підручнику ми вивчимо синтаксис використання оператора assert, а потім приклади коду, щоб побачити його в дії. Ми також побачимо, що таке помилки твердження і як ми можемо використовувати їх для виправлення помилок у коді під час розробки.

Давайте почнемо!

Як використовувати оператор Assert у Python

Ми вивчимо синтаксис використання оператора assert, а потім перейдемо до кодування деяких прикладів.

Синтаксис оператора Assert

Почнемо з синтаксису використання оператора assert у Python:

assert expression, message

тут,

  • вираз — будь-який дійсний вираз Python, який потрібно оцінити. Це може бути умова значення змінної, значення істинності змінної, значення, що повертається функцією, тощо.
  • Поки вираз обчислюється як True, оператор assert не видає помилки та нічого не повертає. Це означає, що програма працює належним чином.
  • Якщо вираз більше не є True, виникає виняток AssertionError.
  • повідомлення є необов’язковим рядком. Ви можете вказати повідомлення, яке відображатиметься в трасуванні щоразу, коли виникає виняток AssertionError.

Далі перейдемо до кодування кількох прикладів, де оператор assert може допомогти нам написати чистіший код без помилок.

Ви можете знайти приклади коду, використані в цьому підручнику, у цій суті GitHub.

Приклади операторів Python Assert

Розглянемо наступний приклад. Скажімо, у вашому коді є змінна знижки. Але ви хочете, щоб його значення завжди було менше або дорівнювало max_discount.

  Як увімкнути CORS за допомогою HTTPOnly Cookie для захисту маркера?

Щоб переконатися, що ви випадково не встановили значення змінної знижки, ви можете додати твердження. Вираз для оцінки: знижка <= максимальна_знижка.

>>> max_discount = 50
>>> discount = 20
>>> assert discount <= max_discount

Тут знижка (20) менша за max_discount (50). Отже, оператор assert не видає жодної помилки.

Виняток AssertionError

Якщо для змінної знижки встановлено значення, що перевищує max_discount, виникає виняток AssertionError.

>>> discount = 75
>>> assert discount <= max_discount
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError

Ми знаємо, що оператор assert також дозволяє нам вказати додатковий рядок повідомлення.

Давайте також використаємо рядок повідомлення, який дає більш описову діагностичну інформацію. До оператора assert додамо f-рядок Python, який також містить значення discount і max_discount.

>>> assert discount <= max_discount, f"discount should be at most {max_discount}; got discount = {discount}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: discount should be at most 50; got discount = 75

Як видно у вихідній клітинці вище, виняток AssertionError тепер включає значення змінних discount і max_discount.

Налагодження та тестування функцій Python за допомогою Assert

Визначаючи функції, ви іноді можете ненавмисно створити помилки (логічні помилки), які перешкоджатимуть вашій функції працювати належним чином.

Візьмемо приклад. Припустімо, що в класі проводиться контрольна робота, і учням надається можливість відповісти на бонусне запитання. Будь-який студент, який відповість на бонусне запитання, отримає 10 додаткових балів у тесті. 😄

Розглянемо таку функцію get_final_score:

  • Він враховує поточний рахунок, рахунок і логічний бонус.
  • Якщо студент відповів на бонусне запитання, логічний бонус має значення True, і він отримує на 10 балів більше, ніж його поточний результат.
  • Потім функція повертає остаточну оцінку.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Давайте зробимо кілька викликів функції. Ми бачимо, що для балів 34 і 40 із бонусом, встановленим на True і False, остаточні бали становлять 44 і 40 відповідно.

print(get_final_score(34,True))
# 44
print(get_final_score(40,False))
# 40

Проте максимальна кількість балів за тест становить, скажімо, 50. Отже, якщо студент набрав 49 балів і також відповів на бонусне запитання, функція get_final_score із задоволенням обчислить остаточний бал 59.

print(get_final_score(49,True))
# 59

Технічно це можливо. Але припустимо, що студент не може набрати більше максимально можливої ​​кількості балів за тест. 🙂

  Як перевірити, чи ваш процесор 32-розрядний чи 64-розрядний

Отже, давайте ініціалізуємо змінну max_score. І зафіксуйте повернуту оцінку від функції у змінній final_score.

Згодом ми додаємо твердження, яке перевіряє, чи final_score менший за max_score.

def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

final_score = get_final_score(47,True)
max_score = 50

assert final_score <= max_score

Тепер ми отримуємо виняток AssertionError для виклику функції get_final_score(47,True):

Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score
AssertionError

Тепер ми додаємо описовий f-рядок до оператора assert Python:

assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score,f"final_score should be at most {max_score}; got {final_score}"
AssertionError: final_score should be at most 50; got 57

Зміна функції

Давайте повернемося назад і змінимо визначення функції get_final_score, щоб виправити неочікувану поведінку:

  • Функція get_final_score також приймає max_score як параметр.
  • Ми перевіряємо, чи бонус відповідає дійсності. Якщо True, ми додаємо 10 балів до змінної оцінки.
  • Потім ми перевіряємо, чи оцінка більша за max_score. Якщо так, ми повертаємо max_score.
  • В іншому випадку ми повертаємо рахунок.

Тепер ми переконалися, що кінцевий результат завжди менший або дорівнює max_score.

def get_final_score(score,bonus,max_score):
    if bonus:
        score += 10
    if score > max_score:
        return max_score
    return score

Як швидку вправу напишіть кілька тверджень, щоб підтвердити, що функція тепер працює належним чином.

  Як назавжди видалити свою адресу Gmail

Примітка щодо виключення AssertionError

Хоча виняток AssertionError виникає, коли вираз отримує значення False, ми повинні пам’ятати, що не обробляти такі помилки як винятки. Це означає, що ми не повинні робити щось подібне:

try:
    <doing this>
except AssertionError:
    <do this>

У попередньому прикладі get_final_score ми використовували твердження, щоб перевірити, чи final_score менше max_score. Потім ми змінили визначення функції таким чином, щоб не було помилок твердження.

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

Підводячи підсумок, вам слід використовувати оператор Python assert для ефективного налагодження та не обробляти AssertionErrors як винятки.

Висновок

Цей посібник допоміг вам зрозуміти, як використовувати оператор assert у Python. Ось підсумок того, що ви дізналися:

  • Інструкції Python assert (твердження) приймають форму assert express. Це перевіряє, чи вираз є істинним. Якщо воно не має значення True, виникає виняток AssertionError.
  • Ви також можете використовувати assert із синтаксичним виразом assert, message. Це друкуватиме рядок повідомлення щоразу, коли станеться виняток AssertionError.
  • Ви повинні пам’ятати, що не слід застосовувати обробку винятків для обробки помилок твердження. Використовуйте твердження як корисний інструмент налагодження для перевірки працездатності вашого коду.

Як розробнику, твердження допоможуть вам з налагодженням. Щоб переконатися, що всі окремі компоненти (модулі) проекту працюють належним чином, ви можете навчитися писати модульні тести на Python.

Далі перегляньте цей список проектів Python для початківців, над якими ви можете працювати.