Hatékony hibakeresés a Python Assert utasítással

Ön programozó? Ha igen, a hibakeresés elengedhetetlen készség, függetlenül attól, hogy milyen nyelven kódolunk. Ebből a cikkből megtudhatja, hogyan használhatja az assert utasítást Pythonban a hatékony hibakereséshez.

Amikor egy projekten dolgozik, több modult kell meghatároznia. Ez magában foglalja a függvényeket, osztálydefiníciókat és egyebeket. És valószínűleg hibákba vagy váratlan eredményekbe fog futni a megvalósítás hibája miatt. Az assert utasítások hasznosak az ilyen kódok hibakeresésében.

Ebben az oktatóanyagban megtanuljuk az assert utasítás használatának szintaxisát, majd kódpéldákat, hogy működés közben lássuk. Azt is meglátjuk, hogy mik azok az állítási hibák, és hogyan tudjuk ezeket felhasználni a fejlesztés során a kódbeli hibák javítására.

Kezdjük!

Az assert nyilatkozat használata Pythonban

Megtanuljuk az assert utasítás használatának szintaxisát, majd folytatjuk néhány példa kódolását.

Az állítási nyilatkozat szintaxisa

Kezdjük az assert utasítás használatának szintaxisával a Pythonban:

assert expression, message

Itt,

  • kifejezés bármely érvényes Python-kifejezés, amelyet ki kell értékelni. Ez lehet a változó értékének feltétele, a változó igazságértéke, a függvényből visszaadott érték stb.
  • Amíg a kifejezés kiértékelése True, az assert utasítás nem dob hibát, és nem ad vissza semmit. Ez azt jelzi, hogy a program az elvárásoknak megfelelően működik.
  • Ha a kifejezés már nem igaz, akkor AssertionError kivétel jelenik meg.
  • üzenet egy opcionális karakterlánc. Megadhat egy üzenetet, amely megjelenik a visszakövetésben, amikor AssertionError kivételt jelez.

Ezután folytassuk néhány példa kódolásával, ahol az assert utasítás segíthet tisztább és hibamentes kód megírásában.

Az ebben az oktatóanyagban használt kódpéldákat ebben a GitHub-összefoglalóban találja.

  7 Runtime Application Self-Protection (RASP) eszközök modern alkalmazásokhoz

Példák Python állítási nyilatkozataira

Tekintsük a következő példát. Tegyük fel, hogy van egy kedvezményváltozó a kódjában. De azt szeretné, ha az értéke mindig kisebb vagy egyenlő legyen, mint a max_discount.

Annak ellenőrzésére, hogy véletlenül nem állította-e be a kedvezményváltozót egy értékre, hozzáadhat egy állítást. Az értékelendő kifejezés a következő: diszkont <= max_kedvezmény.

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

Itt a kedvezmény (20) kisebb, mint a max_discount (50). Tehát az assert utasítás nem dob semmilyen hibát.

Az AssertionError kivétel

Ha a kedvezményváltozó értéke nagyobb, mint max_discount, akkor AssertionError kivétel jelenik meg.

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

Tudjuk, hogy az assert utasítás egy opcionális üzenetkarakterlánc megadását is lehetővé teszi.

Használjunk olyan üzenetet is, amely leíróbb diagnosztikai információkat ad. Az assert utasításhoz adjunk hozzá egy Python f-karakterláncot, amely tartalmazza a diszkont és a max_discount értékeit is.

>>> 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

Ahogy a fenti kimeneti cellában látható, az AssertionError kivétel mostantól tartalmazza a diszkont és a max_discount változók értékeit.

Python-függvények hibakeresése és tesztelése Assert segítségével

A függvények meghatározásakor néha véletlenül olyan hibákat (logikai hibákat) vezethetünk be, amelyek megakadályozzák a funkció rendeltetésszerű működését.

Vegyünk egy példát. Tegyük fel, hogy van egy teszt az osztályban, és a tanulók lehetőséget kapnak, hogy megpróbáljanak egy bónuszkérdést. Minden tanuló, aki megpróbálja a bónuszkérdést, 10 további pontot kap a teszten. 😄

Tekintsük a következő get_final_score függvényt:

  • Egy aktuális pontszámot, pontszámot és egy logikai bónuszt vesz fel.
  • Ha egy tanuló válaszol a bónuszkérdésre, a logikai bónusz igaz, és 10 ponttal többet kap, mint a jelenlegi pontszáma.
  • A függvény ezután visszaadja a végső pontszámot.
def get_final_score(score,bonus):
    if bonus:
        score += 10
    return score

Hívjuk meg néhányszor a függvényt. Azt látjuk, hogy a 34-es és 40-es pontszámok esetén, ha a bónusz igaz és hamis, a végső pontszám 44, illetve 40.

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

A teszt maximális pontszáma azonban mondjuk 50. Tehát ha egy diák 49 pontot szerez, és a bónuszkérdésre is válaszolt, a get_final_score függvény boldogan 59-re számítja ki a végső pontszámot.

print(get_final_score(49,True))
# 59

Technikailag lehetséges. De tegyük fel, hogy egy tanuló nem szerezhet többet a teszten adható maximális pontszámnál. 🙂

  Hogyan lehet egy kis szünetet tartani valakitől a Facebookon

Tehát inicializáljunk egy max_score változót. És rögzítse a visszaadott pontszámot a final_score változóban lévő függvényből.

Ezt követően hozzáadunk egy állítást, amely ellenőrzi, hogy a final_score kisebb-e, mint a 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

Most AssertionError kivételt kapunk a get_final_score(47,True) függvényhíváshoz:

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

Most hozzáadunk egy leíró f-karakterláncot a Python assert utasításhoz:

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

A funkció módosítása

Menjünk vissza, és módosítsuk a get_final_score függvény definícióját a váratlan viselkedés javítása érdekében:

  • A get_final_score függvény is a max_score paramétert veszi fel.
  • Ellenőrizzük, hogy a bónusz igaz-e. Ha igaz, 10 pontot adunk a pontszám változóhoz.
  • Ezután ellenőrizzük, hogy a pontszám nagyobb-e, mint a max_score. Ha igen, akkor a max_score értéket adjuk vissza.
  • Ellenkező esetben a pontszámot adjuk vissza.
  10 legjobb Terraria szervertárhely mindenki számára

Most már biztosítottuk, hogy a végső pontszám mindig kisebb vagy egyenlő legyen, mint a max_score.

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

Gyors gyakorlatként írjon néhány állítást annak megerősítésére, hogy a funkció a várt módon működik.

Megjegyzés az AssertionError kivételről

Bár AssertionError kivétel történik, amikor a kifejezés kiértékelése False, emlékeznünk kell arra, hogy az ilyen hibákat ne kezeljük kivételként. Ez azt jelenti, hogy nem szabad ilyesmit tennünk:

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

A get_final_score korábbi példájában az állítást használtuk annak ellenőrzésére, hogy a final_score kisebb-e, mint a max_score. Ezután úgy módosítottuk a függvénydefiníciót, hogy ne legyenek érvényesítési hibák.

Erre valók az állítások. Ezek józanságellenőrző kódok, és segítenek tisztább kód írásában. A kivételkezelés ezzel szemben a váratlan hibák előrejelzése és kezelése futás közben. Ezek gyakran érvénytelen bemeneti típusokat és értékeket tartalmaznak.

Összefoglalva, Python assert utasítást kell használnia a hatékony hibakereséshez, és ne kezelje az AssertionError-okat kivételként.

Következtetés

Ez az oktatóanyag segített megérteni az assert utasítás használatát a Pythonban. Íme egy összefoglaló a tanultakról:

  • A Python assert utasítások (állítások) assert kifejezést öltenek. Ez ellenőrzi, hogy a kifejezés igaz-e. Ha a kiértékelés nem igaz, akkor AssertionError kivétel jelenik meg.
  • Az assert az assert kifejezéssel, üzenettel is használható. Ez kinyomtatja az üzenetet, amikor AssertionError kivétel történik.
  • Ne feledje, hogy ne alkalmazzon kivételkezelést az állítási hibák kezelésére. És használja az állításokat hasznos hibakereső eszközként a kód épségének ellenőrzéséhez.

Fejlesztőként az állítások segítenek a hibakeresésben. Annak érdekében, hogy a projekt minden egyes összetevője (modulja) a várt módon működjön, megtanulhatja, hogyan kell egységteszteket írni Pythonban.

Ezután tekintse meg azon kezdő Python-projektek listáját, amelyeken dolgozhat.