A strftime() formátumkódjai helyett kifejezőbb nevek használata

Ha dátumokkal és időpontokkal kell dolgozni, akkor igénybe vehetjük a szabványos könyvtár datetime modulját. Feladat lehet olykor, hogy a dátum és időpontokat vagy azok bizonyos részeit egy előre meghatározott struktúrájú karakterláncban kell megjeleníteni. Ilyenkor a datetime modul date, time vagy datetime osztálypéldányokra meghívott strftime() metódussal célt érhetünk. A karakterláncban az egyes dátum- és időkomponenseket formátumkódok elhelyezésével jeleníthetjük meg a kívánt pozíciókban. Az érvényes formátumkódok és jelentésük a Python hivatalos dokumentációjában a datetime modul leírásában megtalálhatók. Azonban a gyakorlatban általában fordított módon merül fel a kérdés: egy megjelenítendő időkomponenshez milyen formátumkód tartozik. Az így rendezett táblázatot a Python tudásépítés lépésről lépésre című e-könyv „Mikor, hol hány óra? – dátum, napi idő és időzónák” alfejezetének „Dátum és idő egyéni formátumú karakterlánc reprezentációja” címe alatt találjuk.

Meglehetősen sok formátumkód áll rendelkezésre az egyedi karakterlánc kialakításához, ami hasznos, viszont a % jelet követő, egykarakteres, többségében kis- vagy nagybetűt tartalmazó kódokból sok esetben nem vagy csak nehezen lehet következtetni az általuk képviselt dátum- vagy időkomponensre. Ez azt jelenti, hogy – ha csak nem mindennapos gyakorlatunk e kódok alkalmazása – a használatuk nehézkes lehet, és később az ilyen kódokkal teletűzdelt karakterlánc olvasása és értelmezése sem lesz egyszerű.

Ezen a kényelmetlenségen úgy lehetne segíteni, ha a kódok helyett a dátum- vagy időkomponensre utaló kifejező nevekkel tudnánk dolgozni. Például ahelyett, hogy ki kellene keresni, vagy megjegyezni, hogy a %B a hónap teljes nevét a %b a hónap rövidített nevét fogja eredményezni, írhatnánk, hogy „month_name_full”, illetve „month_name_abbrev”, vagy például a %x és %X helyett, amelyek az aktuális nyelvterületi beállításnak megfelelő dátum és idő reprezentációkat jelentik, írhatnánk a sokkal kifejezőbb „date”, illetve „time” neveket.

Ezt a célt nem is olyan nehéz megvalósítani, ráadásul több módon is megtehetjük.

Először is, készítsünk egy olyan szótárt, amelyben az egyes dátum- és időkomponensekre utaló kifejező nevek a kulcsok, és a hozzájuk tartozó értékek a megfelelő formátumkódok:

A nevekben olykor szereplő 2d, 3d, 4d és 6d jelöli, hogy hány decimális számjeggyel van az adott érték megjelenítve. Pl. a year_4d azt jelenti, hogy az évszám 4 jeggyel lesz látható. Természetesen az itt látható nevek helyett másokat is alkothatunk magunknak; olyanokat, amelyek számunkra a legjobban kifejezők.

Bár már ezt a szótárt is használhatnánk pl. formázott karakterlánc-literálban (f-string), de még elég sokat kellene gépelni egy-egy komponens beszúrásához, így ez még nem adja a várt kényelmet. E helyett alakítsuk át a nevek és formátumkódok megfeleltetését mezőnevekké, illetve attribútumnevekké, amit namedtuple vagy adatosztály (dataclass) alkalmazásával érhetünk el. Elvben az Enum felsorolástípus is szóba jöhet még mint megoldás, de ennek hátránya, hogy a szimbolikus név után, még a value attribútumot is ki kell írni, hiszen csak akkor kapjuk meg a felsorolástag mögöttes értékét. Viszont a Python 3.11 verziótól rendelkezésre áll a StrEnum felsorolástípus is, amely használata esetén nem kell a value attribútum értékét kikérni. A típusok létrehozásánál az előbb készített szótárunkat fel tudjuk használni a konstruktorkifejezésekben.

Az egyes megoldásokat és használatukat mutatják a következő kódsorok.

Az egyedi kialakítású karakterláncban a dátum- és időkomponensekre utaló kifejező neveket kevés gépeléssel, attribútumhivatkozásként, azaz a . (pont) operátort használva, tudjuk beilleszteni, aminek előnye még, hogy a fejlettebb kódszerkesztők automatikus kód kiegészítő funkciója (code completion) a lehetséges neveket fel is tudja kínálni.

Itt azt is összevethetjük, hogy mennyivel változott a kód olvashatósága ahhoz képest, mint amikor a karakterláncban expliciten a formátumkódokat illesztettük be.

E bejegyzésben szereplő nyelvi elemekről a Python tudásépítés lépésről lépésre című e-könyv következő részeiben olvashatunk részleteiben: „Készétel fogyasztás – a szabványos könyvtár moduljainak használata” fejezet „Mikor, hol hány óra? – dátum, napi idő és időzónák”, „Nemzetközi vizeken – helyben szokásos adatformátumok kezelése” és „Speciális konténer típusok” alfejezetek, valamint a „Különleges osztálydefiníciók” fejezet „Felsorolástípus” és „Adatosztályok” alfejezete.

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