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.