Moduler


Ordbok: modul, pakke, bibliotek og rammeverk
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())