etechblog

Efektivní ladění pomocí příkazu Python Assert Statement

Jste programátor? Pokud ano, ladění je základní dovedností bez ohledu na jazyk, ve kterém kódujete. V tomto článku se dozvíte, jak používat příkaz statement v Pythonu pro efektivní ladění.

Když pracujete na projektu, definujete více modulů. To zahrnuje funkce, definice tříd a další. A pravděpodobně narazíte na chyby nebo neočekávané výsledky kvůli chybě v implementaci. Příkazy Assert jsou užitečné při ladění takového kódu.

V tomto tutoriálu se naučíme syntaxi pro použití příkazuassesste následovaného příklady kódu, abychom to viděli v akci. Také uvidíme, co jsou chyby asercí a jak je můžeme použít k opravě chyb v kódu během vývoje.

Pojďme začít!

Jak používat Assert Statement v Pythonu

Naučíme se syntaxi pro použití příkazu Claim a poté přistoupíme ke kódování několika příkladů.

Syntaxe Assert Statement

Začněme syntaxí pro použití příkazu statement v Pythonu:

assert expression, message

Tady,

  • výraz je jakýkoli platný výraz Pythonu, který má být vyhodnocen. Může to být podmínka hodnoty proměnné, pravdivostní hodnota proměnné, návratová hodnota z funkce a další.
  • Dokud je výraz vyhodnocen jako True, příkaz statement nevyvolá chybu ani nic nevrací. To znamená, že program funguje podle očekávání.
  • Pokud výraz již není True, je vyvolána výjimka AssertionError.
  • zpráva je volitelný řetězec. Můžete zadat zprávu, která se zobrazí ve zpětném trasování vždy, když je vyvolána výjimka AssertionError.

Dále přistoupíme ke kódování několika příkladů, kde nám příkaz statement může pomoci napsat čistší kód bez chyb.

Příklady kódu použité v tomto tutoriálu najdete v tomto GitHubu.

Příklady prohlášení Pythonu

Zvažte následující příklad. Řekněme, že máte ve svém kódu proměnnou slevy. Ale chtěli byste, aby jeho hodnota byla vždy menší nebo rovna max_discount.

  Jak vytvořit pouze jednu stránku na šířku ve Wordu

Chcete-li zkontrolovat, zda jste náhodou nenastavili proměnnou slevy na hodnotu, můžete přidat výraz. Výraz k vyhodnocení je: sleva <= max_sleva.

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

Zde je sleva (20) menší než max_sleva (50). Takže příkaz statement nevyvolá žádnou chybu.

Výjimka AssertionError

Pokud je proměnná slevy nastavena na hodnotu vyšší než max_discount, vyvolá se výjimka AssertionError.

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

Víme, že příkaz statement nám také umožňuje zadat volitelný řetězec zprávy.

Použijme také řetězec zprávy, který poskytuje popisnější diagnostické informace. K příkazu statement přidejte pythonovský f-string, který také obsahuje hodnoty diskont a 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

Jak je vidět ve výstupní buňce výše, výjimka AssertionError nyní zahrnuje hodnoty proměnných diskont a max_discount.

Ladění a testování funkcí Pythonu pomocí Assert

Při definování funkcí můžete někdy nechtěně zavést chyby (logické chyby), které zabrání vaší funkci pracovat tak, jak má.

Vezměme si příklad. Předpokládejme, že je ve třídě test a studenti dostanou šanci zkusit bonusovou otázku. Každý student, který se pokusí o bonusovou otázku, získá v testu 10 bodů navíc. 😄

Zvažte následující funkci get_final_score:

  • Zahrnuje aktuální skóre, skóre a booleovský bonus.
  • Pokud student odpověděl na bonusovou otázku, booleovský bonus je True a získá o 10 bodů více, než je jeho aktuální skóre.
  • Funkce pak vrátí konečné skóre.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Udělejme několik volání funkce. Vidíme, že pro skóre 34 a 40 s bonusem nastaveným na True a False jsou konečné skóre 44, respektive 40.

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

Maximální počet bodů v testu je však řekněme 50. Pokud tedy student získá 49 a zároveň odpověděl na bonusovou otázku, funkce get_final_score s radostí spočítá výsledné skóre 59.

print(get_final_score(49,True))
# 59

Technicky je to možné. Předpokládejme však, že student nemůže získat více než maximální možný počet bodů za test. 🙂

  Jak cestovat časem v „Animal Crossing: New Horizons“

Pojďme tedy inicializovat proměnnou max_score. A zachytit vrácené skóre z funkce v proměnné final_score.

Následně přidáme tvrzení, které kontroluje, zda je konečné_skóre menší než max_skóre.

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

Nyní dostáváme výjimku AssertionError pro volání funkce get_final_score(47,True):

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

Nyní přidáme popisný f-řetězec do příkazu Python statement:

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

Úprava funkce

Vraťme se a upravme definici funkce get_final_score, abychom neočekávané chování opravili:

  • Funkce get_final_score také bere jako parametr max_score.
  • Zkontrolujeme, zda je bonus pravdivý. Pokud je pravda, přidáme 10 bodů k proměnné skóre.
  • Poté zkontrolujeme, zda je skóre větší než max_score. Pokud ano, vrátíme max_score.
  • V opačném případě vracíme skóre.

Nyní jsme zajistili, že konečné skóre je vždy menší nebo rovno max_score.

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

Jako rychlé cvičení napište několik tvrzení, abyste potvrdili, že funkce nyní funguje podle očekávání.

  Správa životního cyklu aplikací (ALM) Vysvětlení za 5 minut nebo méně

Poznámka k výjimce AssertionError

Přestože k výjimce AssertionError dochází, když je výraz vyhodnocen jako False, měli bychom si pamatovat, že takové chyby nelze zpracovávat jako výjimky. To znamená, že bychom neměli dělat něco takového:

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

V předchozím příkladu get_final_score jsme použili aserci ke kontrole, zda je konečné_skóre menší než max_skóre. Poté jsme upravili definici funkce tak, aby nedocházelo k chybám v tvrzeních.

K tomu slouží tvrzení. Jsou to kontroly zdravého rozumu na kód a pomáhají při psaní čistšího kódu. Zpracování výjimek na druhé straně spočívá v předvídání a zpracování neočekávaných chyb za běhu. Ty často zahrnují neplatné typy a hodnoty vstupu.

Abychom to shrnuli, měli byste používat příkaz Pythonu pro efektivní ladění a nezpracovávat AssertionErrors jako výjimky.

Závěr

Tento tutoriál vám pomohl pochopit, jak používat příkaz statement v Pythonu. Zde je souhrn toho, co jste se naučili:

  • Příkazy (tvrzení) v Pythonu mají formu výrazu tvrzení. Tím se zkontroluje, zda je výraz True. Pokud se nevyhodnotí jako True, je vyvolána výjimka AssertionError.
  • Aserci můžete také použít s výrazem deklarace syntaxe, zpráva. Tím se vytiskne řetězec zprávy, kdykoli dojde k výjimce AssertionError.
  • Měli byste si pamatovat, že neimplementujete zpracování výjimek ke zpracování chyb asercí. A používejte aserce jako užitečný nástroj pro ladění pro kontrolu zdravého rozumu vašeho kódu.

Jako vývojáři vám aserce pomáhají s laděním. Abyste zajistili, že všechny jednotlivé komponenty (moduly) projektu budou fungovat podle očekávání, můžete se naučit psát unit testy v Pythonu.

Dále se podívejte na tento seznam začínajících projektů Pythonu, na kterých můžete pracovat.

x