Ефективно отстраняване на грешки с оператора Python Assert

Програмист ли си? Ако е така, отстраняването на грешки е основно умение, независимо от езика, на който кодирате. В тази статия ще научите как да използвате командата assert в Python за ефективно отстраняване на грешки.

Когато работите по проект, ще дефинирате множество модули. Това включва функции, дефиниции на класове и др. И вероятно ще попаднете на грешки или неочаквани резултати поради грешка в внедряването. Изявленията Assert са полезни при отстраняване на грешки в такъв код.

В този урок ще научим синтаксиса за използване на оператора assert, последван от примери на код, за да го видим в действие. Ще видим също какво представляват грешките при твърдения и как можем да ги използваме, за да коригираме грешките в кода по време на разработката.

Нека да започнем!

Как да използвате оператора Assert в Python

Ще научим синтаксиса за използване на оператора assert, след което ще продължим да кодираме някои примери.

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

Нека започнем със синтаксиса за използване на оператора assert в Python:

assert expression, message

Тук,

  • израз е всеки валиден израз на Python, който трябва да бъде оценен. Това може да бъде условие за стойността на променлива, истинска стойност на променлива, върната стойност от функция и др.
  • Докато изразът се оценява на True, операторът assert не извежда грешка или връща нищо. Това показва, че програмата работи според очакванията.
  • Ако изразът вече не е True, възниква изключение AssertionError.
  • съобщение е незадължителен низ. Можете да зададете съобщение, което да се показва при проследяването, когато се повдигне изключение AssertionError.

След това нека продължим да кодираме няколко примера, при които операторът assert може да ни помогне да напишем по-чист код без грешки.

  Как работи 3D печат?

Можете да намерите примерите за код, използвани в този урок, в тази същност на GitHub.

Примери за изявление Assert на Python

Помислете за следния пример. Да кажем, че имате променлива за отстъпка във вашия код. Но бихте искали стойността му винаги да е по-малка или равна на max_discount.

За да проверите дали случайно не сте задали стойност на променливата за отстъпка, можете да добавите твърдение. Изразът за оценка е: отстъпка <= max_discount.

>>> 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 допълнителни точки в теста. 😄

  Как да използвате календара и планирането на събития в Outlook 365 за Mac

Помислете за следната функция 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

Технически е възможно. Но нека приемем, че студентът не може да получи повече от максимално възможните точки за теста. 🙂

Така че нека инициализираме променлива 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. Ако е True, добавяме 10 точки към променливата резултат.
  • След това проверяваме дали резултатът е по-голям от max_score. Ако е така, връщаме max_score.
  • В противен случай връщаме резултат.
  Ръководство за IoT в банкирането и финансовите технологии

Вече гарантираме, че крайният резултат винаги е по-малък или равен на max_score.

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

Като бързо упражнение напишете няколко твърдения, за да потвърдите, че функцията вече работи според очакванията.

Бележка относно изключение AssertionError

Въпреки че възниква изключение AssertionError, когато изразът се изчисли като False, трябва да запомним да не обработваме такива грешки като изключения. Което означава, че не трябва да правим нещо подобно:

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

В предишния пример за get_final_score използвахме твърдението, за да проверим дали final_score е по-малко от max_score. След това модифицирахме дефиницията на функцията, така че да няма грешки в твърденията.

За това са твърденията. Те са проверки за разумност на кода и помагат при писането на по-чист код. Обработката на изключения, от друга страна, е да се предвидят и обработват неочаквани грешки по време на изпълнение. Те често включват невалидни типове и стойности на въвеждане.

За да обобщим, трябва да използвате израза assert на Python за ефективно отстраняване на грешки и да не обработвате AssertionErrors като изключения.

Заключение

Този урок ви помогна да разберете как да използвате оператор assert в Python. Ето обобщение на това, което сте научили:

  • Python assert оператори (твърдения) приемат формата assert израз. Това проверява дали изразът е True. Ако не се изчисли като True, възниква изключение AssertionError.
  • Можете също да използвате assert със синтаксис assert израз, съобщение. Това ще отпечата низа на съобщението, когато възникне изключение AssertionError.
  • Трябва да запомните да не прилагате обработка на изключения за обработка на грешки при твърдения. И използвайте твърденията като полезен инструмент за отстраняване на грешки за проверки на здравината на вашия код.

Като разработчик, твърденията ви помагат при отстраняване на грешки. За да гарантирате, че всички отделни компоненти (модули) на проекта работят според очакванията, можете да научите как да пишете модулни тестове в Python.

След това вижте този списък с проекти на Python за начинаещи, върху които можете да работите.