Osa 7

Skapa dina egna moduler

Att skapa dina egna Python-moduler är enkelt. Vilken som helst fil som innehåller valid Python-kod kan importeras som en modul. Låt oss säga att vi har filen ord.py, med följande innehåll:

def ord_ett(strang: str):
    delar = strang.split(" ")
    return delar[0]

def sista_ordet(strang: str):
    delar = strang.split(" ")
    return delar[-1]

def antal_ord(strang: str):
    delar = strang.split(" ")
    return len(delar)

Funktionerna som definierats i filen kan kommas åt genom att importera filen:

import ord

strang = "Polisstationen var full"

print(ord.ord_ett(strang))
print(ord.sista_ordet(strang))
print(ord.antal_ord(strang))
Exempelutskrift

Polisstationen full 3

Obs! Filen som innehåller Python-modulen måste befinna sig i samma mapp där programmet som importerar modulen finns i. Alternativt kan filen med modulen vara i någon av de andra mappar där Python söker moduler ifrån. I övriga fall kommer Pythontolken inte att hitta modulen när import-satsen körs.

Vi kan använda våra moduler exakt på samma sätt som moduler i Pythons standardbibliotek:

from ord import ord_ett, sista_ordet

mening = input("Ange mening: ")

print("Första ordet var: " + ord_ett(mening))
print("Sista ordet var: " + sista_ordet(mening))
Exempelutskrift

Ange mening: Han höll på att svimma i den heta bussen Första ordet var: Han Sista ordet var: bussen

Använda typledtrådar

När vi använder moduler är typledtrådar speciellt till nytta. Om du använder en kodeditor som stödjer typledtrådar, kommer användandet av moduler att bli mycket enklare.

Till exempel Visual Studio Code visar typledtrådar medan du skriver kod:

7 vihje

Kod i modulens huvudfunktion

Om en modul innehåller kod som inte finns inom en funktionsdefinition (dvs. kod i huvudfunktionen), kommer den här koden att köras automatiskt då modulen importeras.

Låt oss se på en situation där ord.py innehåller några testutskrifter:

def ord_ett(strang: str):
    delar = strang.split(" ")
    return delar[0]

def sista_ordet(strang: str):
    delar = strang.split(" ")
    return delar[-1]

def antal_ord(strang: str):
    delar = strang.split(" ")
    return len(delar)

print(ord_ett("Det här är ett test"))
print(sista_ordet("Ett annat test"))
print(antal_ord("Postlådan var full med tidningar"))

Om vi nu importerar modulen med en import-sats, kommer all kod utanför de definierade funktionerna att köras:

import ord

strang = "Polisstationen var full"

print(ord.ord_ett(strang))
print(ord.sista_ordet(strang))
print(ord.antal_ord(strang))
Exempelutskrift

Det test 5 Polisstationen full 3

Som du ser, är det här inte en riktigt bra sak i vår situation, eftersom vår utskrift nu blandas med testutskrifter från modulen.

Till all lycka finns en lösning, och den är bekant sedan tidigare. Vi måste helt enkelt testa om programmet körs självständigt eller om koden har importerats med en import-sats. Python har en inbyggd variabel __name__ som innehåller namnet på programmet som körs. Om programmet körs självständigt är värdet på den nyss nämnda variabeln __main__. Om programmet däremot har importerats är värdet på variabeln namnet på modulen som importerats (i vårt fall ord).

Nu när vi vet det här kan vi lägga till en if-sats som låter oss köra våra test endast då programmet körs självständigt. Som du ser nedan, är strukturen bekant:

def ord_ett(strang: str) -> str:
    delar = strang.split(" ")
    return delar[0]

def sista_ordet(strang: str) -> str:
    delar = strang.split(" ")
    return delar[-1]

def antal_ord(strang: str) -> int:
    delar = strang.split(" ")
    return len(delar)

if __name__ == "__main__":
    # testar funktionerna
    print(ord_ett("Det här är ett test"))
    print(sista_ordet("Ett annat test"))
    print(sanojen_lkm("Postlådan var full med tidningar"))

Om du kör modulen självständigt, skrivs testutskrifterna ut:

Exempelutskrift

Det test 5

När modulen importeras i ett program, kommer testutskrifterna inte att göras:

import ord

strang = "Polisstationen var full"

print(ord.ord_ett(strang))
print(ord.sista_ordet(strang))
print(ord.antal_ord(strang))
Exempelutskrift

Polisstationen full 3

I uppgifterna under den här kursen har du flera gånger ombetts att ha dina test under ett if __name__ == "__main__" -block. Nu vet du varför.

Loading
Loading...
:
Loading...

Log in to view the quiz

Vänligen svara på en kort enkät om materialet för den här veckan.

Loading...
:
Loading...

Log in to view the quiz

Du har nått slutet av den här delen! Fortsätt till nästa del:

Se dina poäng genom att klicka på cirkeln nere till höger av sidan.