Feilsøk Python-kode effektivt: Mester assert-setningen!

Er du en programmerer? I så fall er feilsøking en avgjørende egenskap, uansett programmeringsspråk du benytter. I denne artikkelen utforsker vi hvordan du kan bruke påstander (assert-setninger) i Python for å effektivisere feilsøkingsprosessen.

Når du arbeider med et prosjekt, definerer du typisk flere moduler, inkludert funksjoner, klassedefinisjoner og mer. Det er ikke uvanlig å støte på feil eller uventede resultater på grunn av logiske feil i koden. Påstander er et kraftfullt verktøy for å identifisere og løse slike problemer.

I denne veiledningen vil vi først gå gjennom syntaksen for assert-setninger, etterfulgt av praktiske kodeeksempler som illustrerer bruken. Vi ser også nærmere på hva en AssertionError er, og hvordan vi kan utnytte den for å rette feil under utviklingsfasen.

La oss komme i gang!

Hvordan bruke assert-setningen i Python

Vi begynner med å forklare syntaksen for assert-setningen, og deretter presentere noen kodeeksempler.

Syntaks for assert-setningen

Syntaksen for å bruke assert i Python er som følger:

assert uttrykk, melding

Her:

  • «uttrykk» er et hvilket som helst gyldig Python-uttrykk som skal evalueres. Dette kan være en betingelse for en variabel, en sannhetsverdi, returverdien fra en funksjon, eller annet.
  • Hvis «uttrykk» evalueres til True, vil ikke assert-setningen generere en feil eller returnere noe. Dette indikerer at programmet oppfører seg som forventet.
  • Dersom «uttrykk» evalueres til False, vil et AssertionError-unntak oppstå.
  • «melding» er en valgfri streng. Du kan inkludere en melding som vises i feilmeldingen når et AssertionError-unntak oppstår.

La oss se på noen eksempler som viser hvordan assert-setningen kan hjelpe oss med å skrive renere og mer pålitelig kode.

Kodeeksemplene i denne veiledningen er tilgjengelige på denne GitHub-repoen.

Eksempler på bruk av assert i Python

La oss se på et eksempel. Anta at du har en rabattvariabel i koden din, og du vil forsikre deg om at verdien aldri overskrider en maksimal rabattgrense.

For å sjekke at du ikke ved et uhell tildeler rabattvariabelen en ulovlig verdi, kan du bruke en assert-setning. Uttrykket som skal evalueres er: «rabatt <= maks_rabatt».

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

I dette tilfellet er rabatten (20) mindre enn max_discount (50), så assert-setningen genererer ikke noen feil.

AssertionError-unntaket

Dersom rabattvariabelen får en verdi som overstiger max_discount, vil et AssertionError-unntak oppstå.

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

Vi vet at assert-setningen også lar oss spesifisere en valgfri meldingsstreng.

La oss legge til en meldingsstreng som gir mer detaljert diagnostisk informasjon. Vi kan bruke en Python f-streng for å inkludere verdiene til «rabatt» og «max_discount» i meldingsstrengen.

>>> assert discount <= max_discount, f"rabatt bør være maks {max_discount}; rabatt = {discount}"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: rabatt bør være maks 50; rabatt = 75

Som vist i utdataet over, inneholder AssertionError-unntaket nå verdiene for variablene «rabatt» og «max_discount».

Feilsøking og testing av Python-funksjoner med Assert

Når du definerer funksjoner, kan du utilsiktet introdusere feil (logiske feil) som hindrer funksjonen i å fungere som forventet.

La oss ta et eksempel. Anta at en test inneholder et bonusspørsmål. En student som svarer riktig på bonusspørsmålet får 10 ekstra poeng. 😄

Tenk deg følgende funksjon, «get_final_score»:

  • Funksjonen tar inn nåværende poengsum («score»), og en boolsk verdi («bonus») som indikerer om studenten har svart på bonusspørsmålet.
  • Hvis «bonus» er True, får studenten 10 poeng ekstra.
  • Funksjonen returnerer deretter den totale poengsummen.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

La oss teste funksjonen. For poengsummer på 34 og 40, med «bonus» satt til True og False, får vi henholdsvis 44 og 40 som sluttresultat.

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

La oss anta at den maksimale poengsummen på testen er 50. Hvis en student oppnår en score på 49 og også svarer på bonusspørsmålet, vil «get_final_score» beregne den endelige poengsummen til 59.

print(get_final_score(49,True))
# 59

Teknisk sett er dette mulig, men la oss anta at en student ikke kan score mer enn den maksimale poengsummen. 🙂

La oss initialisere en «max_score» variabel. Og lagre returverdien fra funksjonen i «final_score» variabelen.

Deretter legger vi til en assert-setning for å sjekke om «final_score» er mindre enn «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 nå et AssertionError-unntak for kallet «get_final_score(47,True)».

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

Vi legger nå til en beskrivende f-streng til assert-setningen:

assert final_score <= max_score,f"sluttpoeng bør være maks {max_score}; fikk {final_score}"
Traceback (most recent call last):
  File "main.py", line 17, in <module>
    assert final_score <= max_score,f"sluttpoeng bør være maks {max_score}; fikk {final_score}"
AssertionError: sluttpoeng bør være maks 50; fikk 57

Endring av funksjonen

La oss gå tilbake og endre definisjonen av «get_final_score»-funksjonen for å korrigere den uventede oppførselen:

  • Funksjonen «get_final_score» tar nå også «max_score» som parameter.
  • Vi sjekker om «bonus» er True. Hvis det er sant, legger vi til 10 poeng til «score» variabelen.
  • Deretter sjekker vi om poengsummen overstiger «max_score». Hvis dette er tilfelle, returnerer vi «max_score».
  • Ellers returnerer vi «score».
def get_final_score(score,bonus,max_score):
    if bonus:
        score += 10
    if score > max_score:
        return max_score
    return score

Vi har nå sørget for at sluttpoengsummen alltid er mindre enn eller lik «max_score».

Som en øvelse, prøv å skrive noen assert-setninger for å bekrefte at funksjonen nå fungerer som forventet.

En merknad om AssertionError-unntak

Selv om et AssertionError-unntak oppstår når uttrykket evalueres til False, er det viktig å huske at slike feil ikke bør håndteres som unntak. Det betyr at vi ikke bør gjøre noe slikt:

try:
    <gjør dette>
except AssertionError:
    <gjør dette>

I det forrige eksemplet med «get_final_score» brukte vi assert-setningen for å sjekke om «final_score» var mindre enn «max_score». Deretter endret vi funksjonsdefinisjonen slik at det ikke oppstår en påstandsfeil.

Det er dette assert-setninger er til for. De er sanity-sjekker for koden din, og hjelper med å skrive mer pålitelig kode. Unntakshåndtering er derimot for å forutse og håndtere uventede feil under utførelsen, som ofte omhandler ugyldige inndata.

For å oppsummere bør du bruke Python assert-setninger for effektiv feilsøking, og ikke behandle AssertionError som et unntak.

Konklusjon

Denne veiledningen har hjulpet deg med å forstå hvordan du bruker assert-setningen i Python. Her er en oppsummering av det du har lært:

  • Python assert-setninger har formen «assert uttrykk». De sjekker om uttrykket evalueres til sant. Hvis uttrykket evalueres til False, oppstår et AssertionError-unntak.
  • Du kan også bruke assert med syntaksen «assert uttrykk, melding». Dette vil skrive ut meldingsstrengen hver gang et AssertionError-unntak oppstår.
  • Husk å ikke implementere unntakshåndtering for å håndtere påstandsfeil. Bruk assert-setninger som et nyttig feilsøkingsverktøy for å sikre at koden din fungerer som forventet.

Som utvikler hjelper påstander deg med å feilsøke. For å sikre at alle komponentene (modulene) i prosjektet ditt fungerer som forventet, kan du undersøke hvordan du skriver enhetstester i Python.

Du kan deretter sjekke ut denne listen over nybegynner Python-prosjekter du kan jobbe med.