Osa 7

Oman moduulin tekeminen

Omien moduulien tekeminen on helppoa Pythonissa, koska mikä tahansa Python-koodia sisältävä tiedosto voi toimia moduulina. Tarkastellaan esimerkkinä seuraavaa tiedostoa sanat.py:

def eka_sana(mjono: str):
    osat = mjono.split(" ")
    return osat[0]

def vika_sana(mjono: str):
    osat = mjono.split(" ")
    return osat[-1]

def sanojen_maara(mjono: str):
    osat = mjono.split(" ")
    return len(osat)

Voimme käyttää tässä tiedostossa olevia funktioita toisessa tiedostossa seuraavasti:

import sanat

mjono = "Vesihiisi sihisi hississä"

print(sanat.eka_sana(mjono))
print(sanat.vika_sana(mjono))
print(sanat.sanojen_maara(mjono))
Esimerkkitulostus

Vesihiisi hississä 3

Huomaa moduulin kooditiedoston pitää sijaita joko samassa hakemistossa ohjelman kanssa tai jossakin Pythonin oletushakemistossa jotta sen voi ottaa käyttöön import-komennolla.

Voimme käyttää omaa moduulia samalla periaatteella kuin standardikirjaston moduuleja. Esimerkiksi näin:

from sanat import eka_sana, vika_sana

lause = input("Anna lause: ")

print("Eka sana oli: " + eka_sana(lause))
print("Viimeinen sana oli: " + vika_sana(lause))
Esimerkkitulostus

Anna lause: Python on metka ohjelmointikieli Eka sana oli: Python Viimeinen sana oli: ohjelmointikieli

Hyötyä tyyppivihjeistä

Moduulissa on hyödyllistä, että funktioissa käytetään tyyppivihjeitä. Kun joku muu käyttää moduulia editorilla, joka ymmärtää tyyppivihjeitä, ne helpottavat moduulin käyttämistä.

Esimerkiksi Visual Studio Code näyttää funktion tyypit näin koodia kirjoittaessa:

7 vihje

Moduulin päätason koodi

Jos moduulissa on päätason koodia, joka ei ole funktion sisällä, koodi suoritetaan automaattisesti, kun moduuli otetaan mukaan import-komennolla toisessa tiedostossa.

Oletetaan, että sanat.py-tiedostoon on kirjoitettu muutama testitapaus:

def eka_sana(mjono: str):
    osat = mjono.split(" ")
    return osat[0]

def vika_sana(mjono: str):
    osat = mjono.split(" ")
    return osat[-1]

def sanojen_maara(mjono: str):
    osat = mjono.split(" ")
    return len(osat)

print(eka_sana("Tämä on testi"))
print(vika_sana("Tämä on testeistä toinen"))
print(sanojen_maara("Yks kaks kolme neljä viisi"))

Kun moduuli otetaan nyt käyttöön import-lauseella, suoritetaan automaattisesti myös moduulissa funktioiden ulkopuolella oleva koodi:

import sanat

mjono = "Vesihiisi sihisi hississä"

print(sanat.eka_sana(mjono))
print(sanat.vika_sana(mjono))
print(sanat.sanojen_maara(mjono))
Esimerkkitulostus

Tämä toinen 5 Vesihiisi hississä 3

Tämä ei ole hyvä, koska moduulin käyttäjän ohjelmaa sotkee moduulissa oleva testitulostus.

Pythonista löytyy onneksi ratkaisu pulmaan. Ohjelmassa on mahdollista testata, suoritetaanko ohjelmaa itseään vai onko ohjelma otettu käyttöön moduulina import-lauseella. Tämä onnistuu muuttujan __name__ avulla. Python tallentaa muuttujaan tiedon suoritettavasta ohjelmasta: jos ohjelmaa suoritetaan sellaisenaan, muuttujan arvo on merkkijono __main__. Jos ohjelma on tuotu osaksi jotain toista ohjelmaa, muuttujan arvona on suoritettavan ohjelman nimi (eli tässä tapauksessa sanat).

Moduuliin voidaan siis lisätä edellistä tietoa hyödyntäen ehtolause, joka avulla testikoodi suoritetaan ainoastaan silloin, kun ohjelma ajetaan omana itsenään eikä toisen ohjelman osaksi tuotuna:

def eka_sana(mjono: str) -> str:
    osat = mjono.split(" ")
    return osat[0]

def vika_sana(mjono: str) -> str:
    osat = mjono.split(" ")
    return osat[-1]

def sanojen_maara(mjono: str) -> int:
    osat = mjono.split(" ")
    return len(osat)

if __name__ == "__main__":
    # Testataan funktioiden toimintaa
    print(eka_sana("Tämä on testi"))
    print(vika_sana("Tämä on testeistä toinen"))
    print(sanojen_lkm("Yks kaks kolme neljä viisi"))

Nyt moduulin itsensä suorittaminen suorittaa testikutsut:

Esimerkkitulostus

Tämä toinen 5

Kun moduuli sen sijaan tuodaan osaksi jotain muuta ohjelmaa, testejä ei suoriteta:

import sanat

mjono = "Vesihiisi sihisi hississä"

print(sanat.eka_sana(mjono))
print(sanat.vika_sana(mjono))
print(sanat.sanojen_maara(mjono))
Esimerkkitulostus

Vesihiisi hississä 3

Loading
:
Loading...
:
Loading...

Kirjaudu sisään nähdäksesi tehtävän.

Vastaa lopuksi osion loppukyselyyn:

:
Loading...
:
Loading...

Kirjaudu sisään nähdäksesi tehtävän.

Seuraava osa: