Miért hasznos, hogy az objektumoknak van igazságértéke?

A Pythonban minden objektum rendelkezik logikai igaz vagy hamis értékkel. Ez azt jelenti, hogy bármely objektumra elvégezhető a logikai értékvizsgálat.

Egy objektum logikai értékét közvetlenül úgy kérdezhetjük le, hogy a vizsgált objektumot a bool() konstruktor zárójelei közé írjuk, és ennek eredményeképpen True vagy False értéket kapunk.

Alapértelmezésben minden objektum logikai igaz (True) értékkel rendelkezik. Ez alól kivételt képeznek:

  • Az üres konténerek. Pl.: ”, (), [], {}, set(), frozenset(), bytes(), bytearray(), range(0).
  • Bármelyik számtípus nulla értéke. Pl.: 0, 0.0, 0j, 0e0.
  • A None és False konstansok, vagy ezeket eredményező kifejezések.
  • Azok a saját készítésű objektumok, amelyeket a definíciójukban szándékosan False értékre állítunk a __bool__ metódus implementálásával.

Azért hasznos, hogy az objektumoknak van igazságértéke, mert:

  • rövidebb és olvashatóbb feltételvizsgálatokat tesz lehetővé,
  • feltételvizsgálatoknál egységesen lehet kezelni a különböző adattípusokat,
  • megkönnyíti a logikai műveletek használatát,
  • hozzájárul a Pythonra jellemző tömör és jól olvasható kódhoz.

Ennek eredményeként kevesebb kódot kell írni, miközben a program szándéka világosabb marad.

Mindennek demonstrálására vegyünk egy példát, amely modellezi egy webáruház megrendelési adatainak összegzését. Ezt mutatja az alábbi programkód.

A program sorban egymás után veszi a vásárlókat, és a következő adatokat jeleníti meg, ha azok rendelkezésre állnak:

  • a vásárló neve (preferáltan a becenév, ha adott),
  • a kosár tartalmára vonatkozó információk,
  • az eddigi vásárlások alapján igénybe vehető kedvezmény,
  • az értesítéshez használható e-mail cím.

Itt nem használtuk ki az objektumok igazságértékét, ezért mint látható, a feltételvizsgálatoknál logikai operátorok, zárójelezés, függvényhívás és szelekciós utasítás is szerepel.

Ha azonban kihasználjuk azt, hogy az objektumoknak van igazságértéke, akkor az előző programkódot a ciklustörzsben az alábbiak szerint módosíthatjuk.

E változatban a feltételvizsgálatoknál nincs szükség logikai operátorokra, zárójelezésre, függvényhívásra, és a szelekciós utasítás is helyettesíthető egy logikai kifejezéssel. Ezzel a kód inkább az üzleti logikát fejezi ki, és kevésbé az ellenőrzések technikai részleteit. Az objektumok igazságértéke tehát nem csupán gépelést spórol, hanem magasabb absztrakciós szinten teszi olvashatóvá a programot.

Felmerülhet a kérdés, hogy miért működik az if customer["cart"] ilyen egyszerűen, vagyis anélkül, hogy a Cart osztályban definiáltuk volna a __bool__ metódust? A válasz a Python igazságérték-meghatározási sorrendjében rejlik.

Amikor a Python egy objektum logikai értékét meghatározza, akkor a következőket teszi: ha van __bool__ metódus, akkor azt meghívja és annak eredményét használja. Ha nincs __bool__, de van __len__, akkor azt hívja meg. Ha ennek eredménye 0, akkor az objektum False értékű, egyébként True. Ha az objektumban sem a __bool__, sem a __len__ nincs implementálva, akkor az objektum alapértelmezetten True értékű.

Mivel a Cart implementálja a __len__ metódust, ezért az igazságérték meghatározásánál ennek visszatérési értéke lesz figyelembe véve.

A __bool__ metódus felülírásával kapcsolatos tudnivalókról a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv „Konténerek megvalósítása” fejezetében tájékozódhatunk.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.