Moduler
Ordbok: modul, pakke, bibliotek og rammeverk
En modul er en samling med relaterte funksjoner og variabler man kan importere. For eksempel
random
ogmath
som vi har vært borti tidligere i kurset. Du kan tenke på en modul som én «fil» med kode.En pakke er en samling av moduler (og av og til andre, mindre pakker) som er relatert til hverandre. Du kan tenke på en pakke som en slags «mappe» med relatert kode.
Et bibliotek er egentlig bare en kjempestor pakke. Det er teknisk sett ingen forskjell på et bibliotek og en pakke, men dersom pakken blir veldig stor og generell, kalles det ofte et bibliotek. Hvor grensen går mellom pakke og bibliotek er litt opp til øyet som ser.
Et relatert begrep er et rammeverk. Et rammeverk kan ta form av alt fra en modul til et bibliotek, men har den egenskapen at det legger “rammene” for hvordan koden skal skrives; for eksempel er
uib_inf100_graphics
ikke bare en modul men også et rammeverk, siden vi er nødt til å strukturere koden vår på en spesiell måte for å bruke det. Et rammeverk kan kjennes igjen ved at det er selve rammeverket som kaller funksjonene vi skriver, og ikke bare omvendt.
Importere moduler
Det finners flere måter å importere en modul på.
# Standard import
# For å bruke ting fra modulen, skriver vi modulnavn.navnpåting
import math
print(math.ceil(1.1))
print(math.pi)
# Import med nytt navn
# Kjekt hvis man vil bruke modulnavnet til et annet formål, eller
# hvis man har lyst på et kortere kallenavn på modulen
import math as ma
math = 42
print(ma.ceil(1.1))
print(ma.pi)
print(math)
# Import av kun spesifikke ting
# Man slipper bruke modulnavn først
# Man kan gi kallenavn til hver enkelt ting med `as`
from math import ceil as round_up, pi
print(round_up(1.1))
print(pi)
print(math.floor(1.9)) # Krasjer
print(floor(1.9)) # Ville også krasjet
# Import av alle tingene i math.
# FARE! DETTE BØR IKKE GJØRES ANNET ENN MED RAMMEVERK! MAN HAR INGEN
# KONTROLL PÅ HVA MAN IMPORTERER! PLUTSELIG KAN FUNKSJONER HA FÅTT EN
# HELT NY BETYDNING VI IKKE FORVENTER!
from math import *
print(ceil(1.1))
print(pi)
print(floor(1.9))
Egne moduler
Å lage sin egen modul er så enkelt som å lagre en python-fil. For eksempel, vi kan ha to python-filer foo.py og bar.py, hvor sistnevnte importerer førstnevnte som modul:
# foo.py
def hello():
return "Hello there"
# bar.py
import foo
print(foo.hello())
For at dette skal virke, er det viktig at foo.py og bar.py ligger i samme mappe. Det er også mulig å importere moduler som er lagret i undermapper. Dersom vi flytter foo.py inn i en mappe lib slik at bar ligger i samme mappe som lib, kan vi importere foo slik:
# bar.py
import lib.foo
print(lib.foo.hello())
eller
# bar.py
from lib import foo
print(foo.hello())
Hovedfil og modul
Når en modul importeres, kjøres all koden som er i filen. For eksempel,
# foo.py
def hello():
return "Hello there"
print("Tester hello i foo:", hello())
# bar.py
from foo import hello # Oops, skriver ut 'Tester hello i foo: Hello there'
print(hello())
Det kan være praktisk at en modul kan benyttes som en selvstendig enhet, men også kan importeres uten at det da kommer utskrift til terminalen eller andre merkelige sideeffekter. Til dette kan vi sjekke om en spesiell variabel som heter __name__
har den spesielle verdien "__main__"
:
# foo.py
def hello():
return "Hello there"
if __name__ == "__main__":
# Denne koden kjøres når foo.py blir kjørt som hovedfil, men ikke
# når foo.py blir importert som modul
print("Tester hello i foo:", hello())