Програмист ли си? Ако е така, отстраняването на грешки е основно умение, независимо от езика, на който кодирате. В тази статия ще научите как да използвате командата assert в Python за ефективно отстраняване на грешки.
Когато работите по проект, ще дефинирате множество модули. Това включва функции, дефиниции на класове и др. И вероятно ще попаднете на грешки или неочаквани резултати поради грешка в внедряването. Изявленията Assert са полезни при отстраняване на грешки в такъв код.
В този урок ще научим синтаксиса за използване на оператора assert, последван от примери на код, за да го видим в действие. Ще видим също какво представляват грешките при твърдения и как можем да ги използваме, за да коригираме грешките в кода по време на разработката.
Нека да започнем!
Съдържание
Как да използвате оператора Assert в Python
Ще научим синтаксиса за използване на оператора assert, след което ще продължим да кодираме някои примери.
Синтаксис на оператора Assert
Нека започнем със синтаксиса за използване на оператора assert в Python:
assert expression, message
Тук,
- израз е всеки валиден израз на Python, който трябва да бъде оценен. Това може да бъде условие за стойността на променлива, истинска стойност на променлива, върната стойност от функция и др.
- Докато изразът се оценява на True, операторът assert не извежда грешка или връща нищо. Това показва, че програмата работи според очакванията.
- Ако изразът вече не е True, възниква изключение AssertionError.
- съобщение е незадължителен низ. Можете да зададете съобщение, което да се показва при проследяването, когато се повдигне изключение AssertionError.
След това нека продължим да кодираме няколко примера, при които операторът assert може да ни помогне да напишем по-чист код без грешки.
Можете да намерите примерите за код, използвани в този урок, в тази същност на 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 допълнителни точки в теста. 😄
Помислете за следната функция 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.
- В противен случай връщаме резултат.
Вече гарантираме, че крайният резултат винаги е по-малък или равен на 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 за начинаещи, върху които можете да работите.