Effektiv debugging med Python Assert Statement

Er du programmør? Hvis det er tilfældet, er debugging en væsentlig færdighed, uanset hvilket sprog du koder i. I denne artikel vil du lære, hvordan du bruger assert-sætningen i Python til effektiv fejlfinding.

Når du arbejder på et projekt, vil du definere flere moduler. Dette inkluderer funktioner, klassedefinitioner og mere. Og du vil sandsynligvis løbe ind i fejl eller uventede resultater på grund af en fejl i implementeringen. Assert-udsagn er nyttige ved fejlretning af sådan kode.

I denne øvelse lærer vi syntaksen for at bruge assert-sætningen efterfulgt af kodeeksempler for at se den i aktion. Vi vil også se, hvad påstandsfejl er, og hvordan vi kan bruge dem til at rette fejlene i koden under udvikling.

Lad os begynde!

Sådan bruges Assert Statement i Python

Vi lærer syntaksen for at bruge assert-sætningen, og fortsætter derefter med at kode nogle eksempler.

Syntaks for påstandserklæringen

Lad os starte med syntaksen for at bruge assert-sætningen i Python:

assert expression, message

Her,

  • udtryk er ethvert gyldigt Python-udtryk, der skal evalueres. Dette kan være en betingelse for værdien af ​​variabel, sandhedsværdi af variabel, returværdi fra en funktion og mere.
  • Så længe udtrykket evalueres til True, kaster assert-sætningen ikke en fejl eller returnerer noget. Dette indikerer, at programmet fungerer som forventet.
  • Hvis udtrykket ikke længere er Sandt, opstår der en AssertionError-undtagelse.
  • besked er en valgfri streng. Du kan angive en meddelelse, der bliver vist i sporet tilbage, når der rejses en AssertionError-undtagelse.

Lad os derefter fortsætte med at kode et par eksempler, hvor assert-sætningen kan hjælpe os med at skrive renere og fejlfri kode.

Du kan finde kodeeksemplerne, der er brugt i denne tutorial, i denne GitHub-gist.

  Apple Watch sidder fast på Apple-logoet? 9 måder at løse det på!

Eksempler på Python’s Assert Statement

Overvej følgende eksempel. Lad os sige, at du har en rabatvariabel i din kode. Men du vil gerne have, at dens værdi altid er mindre end eller lig med max_discount.

For at kontrollere, at du ved et uheld ikke indstiller rabatvariablen til en værdi, kan du tilføje en påstand. Udtrykket, der skal evalueres, er: rabat <= max_rabat.

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

Her er rabat (20) mindre end max_rabat (50). Så assert-sætningen giver ingen fejl.

AssertionError-undtagelsen

Hvis rabatvariablen er sat til en værdi større end max_discount, opstår der en AssertionError-undtagelse.

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

Vi ved, at assert-sætningen også giver os mulighed for at angive en valgfri meddelelsesstreng.

Lad os også bruge en meddelelsesstreng, der giver en mere beskrivende diagnostisk information. Til assert-sætningen, lad os tilføje en Python f-streng, der også indeholder værdierne for rabat og 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

Som det ses i outputcellen ovenfor, inkluderer AssertionError-undtagelsen nu værdierne af discount- og max_discount-variablerne.

Fejlretning og test af Python-funktioner med Assert

Når du definerer funktioner, kan du nogle gange utilsigtet introducere fejl (logiske fejl), der forhindrer din funktion i at fungere efter hensigten.

Lad os tage et eksempel. Antag, at der er en test i en klasse, og eleverne får mulighed for at prøve et bonusspørgsmål. Enhver studerende, der prøver bonusspørgsmålet, får 10 ekstra karakterer i testen. 😄

Overvej følgende funktion get_final_score:

  • Det tager en aktuel score, score og en boolesk bonus.
  • Hvis en elev har besvaret bonusspørgsmålet, er den boolske bonus Sand, og de får 10 point mere end deres nuværende score.
  • Funktionen returnerer derefter den endelige score.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Lad os foretage et par opkald til funktionen. Vi ser, at for score på 34 og 40 med bonus sat til True og False, er slutresultaterne henholdsvis 44 og 40.

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

Dog er det maksimale point på testen f.eks. 50. Så hvis en elev scorer 49 og også har besvaret bonusspørgsmålet, vil funktionen get_final_score med glæde beregne den endelige score til 59.

print(get_final_score(49,True))
# 59

Teknisk set er det muligt. Men lad os antage, at en elev ikke kan score mere end det maksimalt mulige point for testen. 🙂

  Jeg brugte en Cortana Smart Speaker hele weekenden. Her er hvorfor det mislykkedes

Så lad os initialisere en max_score variabel. Og indfang den returnerede score fra funktionen i final_score-variablen.

Efterfølgende tilføjer vi en påstand, der tjekker om final_score er mindre end 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

Vi får nu en AssertionError-undtagelse for funktionskaldet get_final_score(47,True):

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

Nu tilføjer vi en beskrivende f-streng til Python assert-sætningen:

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

Ændring af funktionen

Lad os gå tilbage og ændre definitionen af ​​funktionen get_final_score for at rette op på den uventede adfærd:

  • Funktionen get_final_score tager også max_score som en parameter.
  • Vi tjekker om bonussen er sand. Hvis Sand, tilføjer vi 10 point til scorevariablen.
  • Derefter tjekker vi, om scoren er større end max_score. Hvis ja, returnerer vi max_score.
  • Ellers returnerer vi score.
  Hvad er den gule Outlook-trekant?

Vi har nu sikret, at den endelige score altid er mindre end eller lig med max_score.

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

Som en hurtig øvelse kan du skrive et par påstande for at bekræfte, at funktionen nu fungerer som forventet.

En note om AssertionError Exception

Selvom en AssertionError-undtagelse opstår, når udtrykket evalueres til False, skal vi huske ikke at håndtere sådanne fejl som undtagelser. Det betyder, at vi ikke skal gøre noget som dette:

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

I det forrige eksempel på get_final_score brugte vi påstanden til at kontrollere, om final_score er mindre end max_score. Derefter ændrede vi funktionsdefinitionen, så der ikke er nogen påstandsfejl.

Det er det, påstande er til for. De er fornuftstjek for kode og hjælper med at skrive renere kode. Undtagelseshåndtering er på den anden side at forudse og håndtere uventede fejl under kørsel. Disse inkluderer ofte ugyldige inputtyper og værdier.

For at opsummere, bør du bruge Python assert-sætning til effektiv fejlfinding og ikke håndtere AssertionErrors som undtagelser.

Konklusion

Denne tutorial hjalp dig med at forstå, hvordan du bruger assert statement i Python. Her er en oversigt over, hvad du har lært:

  • Python assert-udsagn (assertions) har formen assert-udtryk. Dette kontrollerer, om udtrykket er sandt. Hvis den ikke evalueres til True, rejses en AssertionError-undtagelse.
  • Du kan også bruge assert med syntaks assert udtryk, besked. Dette vil udskrive meddelelsesstrengen, når der opstår en AssertionError-undtagelse.
  • Du skal huske ikke at implementere undtagelseshåndtering for at håndtere påstandsfejl. Og brug påstande som et nyttigt fejlfindingsværktøj til fornuftstjek af din kode.

Som udvikler hjælper påstande dig med fejlretning. For at sikre, at alle de enkelte komponenter (moduler) i projektet fungerer som forventet, kan du lære at skrive enhedstests i Python.

Tjek derefter denne liste over begyndere Python-projekter, du kan arbejde på.