Hogyan definiáljunk felülírásvédett konstansokat?

A kérdés elsőre talán még ellentmondásosnak is tűnhet, hiszen a konstans attól konstans, hogy nem változik az értéke a program futása alatt.

Ez elméletben így is van. A gyakorlatban azonban más a helyzet. A Python ugyanis nem biztosít alapban külön típust a konstansok definiálásához. Konstanst létrehozni egy szokványos változóhoz történő értékadással lehet azzal a konvencióval, hogy ilyenkor a változó nevét csupa nagybetűvel írjuk. Ez azonban csupán egy figyelemfelhívás a kód olvasójának vagy használójának, hogy e változó értékét nem szabad módosítani. Egy névadási konvenció azonban nem véd meg egy esetleges véletlen felülírástól.

De nem kell beletörődni ebbe a helyzetbe, mert ha félünk, hogy a konstansok értéke bármilyen okból esetleg megváltozzon, akkor több megoldás is kínálkozik arra, hogy felülírhatatlan konstansokat hozzunk létre.

Az alábbiakban három eltérő megoldást láthatunk.

Az első egy mezőneves tuple (named tuple) objektumot használ, amelynek egyes mezői lesznek a különböző konstansok nevei. A defaults argumentumaként pedig a konstans értékeit soroljuk fel. A példa azt is mutatja, hogy egy konstanst különböző nevekkel is hivatkozhatjuk, akár a matematikában megszokott görög betűkkel is, minthogy a Python megengedi, hogy az azonosítók Unicode karaktereket tartalmazzanak. (Erről egy korábbi bejegyzésben már szó volt.)

A második megoldás egy hagyományos osztálydefinícióban csak olvasható tulajdonságokként (property) határozza meg a konstansokat.

A harmadik megoldásban egy adatosztály (data class) attribútumai képezik a konstansokat. Azt, hogy ezeket ne lehessen felülírni úgy oldjuk meg, hogy a dataclass dekorátor frozen paraméterének a True értéket adjuk.

A három megoldásban szereplő nyelvi elemek részletes leírását és példákkal illusztrált használatát a Python tudásépítés lépésről lépésre című e-könyv természetesen tartalmazza.

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