Tudtad, hogy a Pythonban egy függvénynek is lehet attribútuma?

Azzal bizonyára tisztában vagy, hogy a Pythonban minden objektum. Az objektumok pedig attribútumokkal rendelkeznek, amelyek képviselhetnek adatot (pl. szám, karakterlánc), de tartalmazhatnak futtatható kódot. Ezek a hívható (callable) objektumok.

Tehát a függvények is objektumok, ezért alapból is rendelkeznek bizonyos speciális attribútumokkal. Ilyen többek között __name__, amely a függvény definíciójában megadott nevét adja vissza, vagy például a __doc__, amely értéke a függvény feladatát és paramétereit ismertető dokumentációs karaktersorozat.

A saját magunk által definiált függvényekhez ezeken felül meghatározhatunk egyedi attribútumokat is.

A kérdés, hogy mi értelme lehet ennek? A kérdés azért merülhet fel, mert egy függvény lényegét a paraméterek, a függvénytörzsben egy hívás hatására lefutó utasítássor, és az ennek eredményeképpen előálló visszatérési érték adja. Kell ezentúl bármi jellemzőt hozzáadni?

A kérdésre a válasz, hogy nem, nem kell. De lehet, és bizonyos esetekben akár jól is jöhet ez a lehetőség. A Python tudásépítés lépésről lépésre könyvben több alkalmazási lehetőséget láthatunk a függvény metaadatainak megadásától, a függvény belső változói értékének kinyeréséig.

Most illusztrációs céllal egy egyszerű függvényt definiálunk, amely egy derékszögű háromszög adott két befogója alapján kiszámítja az átfogót. Ugyanakkor, a programunkban e függvény minden hívásakor valamiért szükségünk van a befogók és az átfogó négyzetére. Mivel a függvényünk csak az átfogó értékét szabad, hogy visszaadja, ezért az egyes értékek négyzetét különböző attribútumokban tároljuk el, amelyeket a függvény hívása után ki tudunk olvasni. Ezt mutatja az alábbi kód.

Meg kell azért jegyeznünk, hogy attribútumoknak függvényobjektumokhoz való hozzárendelése nem gyakori programozási technika, aminek részben az az oka, hogy a függvényt jellemző metaadatokat más módon is ki lehet nyerni, másrészt a függvénydefinícióban szereplő algoritmus logikájának áttekinthetőségét zavarhatja az attribútumok definíción belül történő létrehozása. Mindazonáltal ez egy lehetőség, amelyet nem baj, ha ismerünk, és egy adott szituációban alkalmazni is tudunk.

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