Hopp til innhold

Python

språket det meste av nettstedets verktøy er skrevet i

Hva det er

Python er et programmeringsspråk til generell bruk der kildekoden kjøres av en tolk i stedet for å bli kompilert på forhånd til en egen binærfil. Dokumentasjonen kaller det tolket, interaktivt og objektorientert, med moduler, unntak, dynamisk typing og datatyper på høyt nivå innebygd. Det de fleste legger merke til først, er at innrykk er syntaks: en blokk er det som står innrykket under linjen som åpner den, så oppsettet en leser ser, er den strukturen tolken kjører. Guido van Rossum begynte på språket i juleferien 1989, med erfaringen fra arbeidet med språket ABC ved CWI i Amsterdam, la det ut i februar 1991 og oppkalte det etter manusene til Monty Python’s Flying Circus, som han leste på den tiden.

Typingen er dynamisk. Et navn bindes til et objekt mens programmet kjører, og typen hører til objektet, ikke til navnet, så den samme variabelen kan holde et tall på én linje og en streng på den neste. Valgfrie annotasjoner, standardisert i PEP 484, lar en funksjon oppgi hva den forventer og returnerer, men den PEP-en sier klart at ingen typesjekking skjer ved kjøretid, og at Python skal forbli et dynamisk typet språk. Annotasjonene leses av egne verktøy, typesjekkere og editorer, mens tolken lagrer dem uten å håndheve dem.

Språket leveres med et stort standardbibliotek, som veiledningen beskriver som «batteries included»: filer, JSON, SQLite, regulære uttrykk, underprosesser, argumenttolking og mer, alt uten å installere noe. Alt annet kommer fra tredjeparter, og pakkene installeres som regel med pip fra Python Package Index. Fordi én tolk bare kan holde én versjon av hver pakke, har standardbiblioteket også venv, som lager et selvstendig miljø per prosjekt, slik at ett program kan bruke versjon 1.0 av et bibliotek mens et annet bruker 2.0.

Nye versjoner kommer etter en kalender. Siden Python 3.9 har PEP 602 sendt ut en funksjonsutgivelse hver oktober etter ca. sytten måneders utvikling, og hver av dem vedlikeholdes i fem år. Fra 3.13 betyr det to år med vanlige feilrettingsutgivelser, omtrent annenhver måned, og deretter tre år med bare sikkerhetsrettinger. Python 3.15.0 kom ut 9. oktober 2026. Python 3.10 nådde slutten av levetiden sin 1. oktober 2026, og Python 2.7, den siste i den andre serien, sluttet å få støtte 1. januar 2020. Referansetolken, CPython, har lenge hatt en global tolkelås (global interpreter lock) som lar bare én tråd kjøre Python-kode om gangen. PEP 703 la til et bygg uten den, og PEP 779 pekte ut 3.14 som tidsrammen for fasen der dette bygget med fri tråding er offisielt støttet, men fortsatt valgfritt.

Hvorfor det er viktig

Python er ofte den korteste veien fra et spørsmål til et program som virker. Et skript som leser en fil, spør en database og skriver en rapport, kan skrives med standardbiblioteket alene, kjøres med en gang og endres uten et byggesteg. Det er derfor språket så ofte ender som limet i datapipelines, byggeverktøy og testrigger.

Lesbarhet er et bevisst designmål og ikke en bivirkning. The Zen of Python, PEP 20, sier at lesbarhet teller, og PEP 8, stilguiden for standardbiblioteket, avgjør spørsmålene et team ellers ville kranglet om, fra navngiving til linjen på 79 tegn.

Fleksibiliteten har en pris, og den kommer sent. Et feilstavet attributt, en None der det var ventet en streng, eller en argumenttype som er feil, er en feil først når den linjen kjører, og det kan være i produksjon. Team som lener seg på Python for noe som skal vare, legger derfor til de sjekkene språket lar være: en linter, annotasjoner med en typesjekker i kvalitetsporten, og tester som faktisk kjører kodeveiene.

Kalenderen betyr like mye som koden. Hver tolkeversjon har en fast sluttdato, så en installasjon som ingen rører, glir ut av sikkerhetsstøtten etter en publisert plan. Et prosjekt som oppgir minsteversjonen sin og flytter seg framover innenfor de to årene med feilrettinger, bytter en krise mot én planlagt oppgradering i året. For dere som eier et slikt prosjekt, er det en avveining som er lett å ta: én kjent jobb hvert år mot en ukjent jobb på et dårlig tidspunkt.

Slik ser det ut i praksis

I porteføljen er Python språket i en databasedrevet generator for CV og portefølje: 41 moduler og 10 580 linjer som gjengir seks utdataformater, fra HTML og PDF til Markdown og JSON, fra én SQLite-database med 23 tabeller. En pipeline i 19 trinn bygger databasen, og hvert trinn er trygt å gjenta. Avhengighetene under kjøring ble holdt på nøyaktig to, en malmotor og en PDF-renderer, ut fra argumentet om at en dokumentgenerator som ikke kan installeres om fem år, ikke har bevart noe. Siden nevner også prisen: et dokument lages nå bare ved å kjøre generatoren.

Python vant også en direkte sammenligning i en pipeline for strømforbruk per time, som ble bygd på tre måter, i Python, i JQ og i SQL på PostgreSQL, for å gjøre uregelmessige målinger om til én rad per time og sone, med netto forbruk som produksjon pluss import minus eksport. Varianten skrevet som rene Python-funksjoner var raskest: den behandlet én dags data på 34 ms og et datasett på 30 dager på 180 ms.

Dette nettstedet bygges av Hugo, og de 22 hjelpeskriptene, til sammen 8 408 linjer, er skrevet i Python. Hvert av dem bruker bare standardbiblioteket, unntatt skriptet som importerer tegninger, som trenger Pillow for å beskjære dem. Filen .tool-versions oppgir Python 3.14.7, med regelen at tolken kan være nyere, men aldri eldre, og task doctor sjekker det mot den installerte binærfilen i stedet for å stole på filen. Ruff er linteren, og basedpyright sjekker typer på nivået standard, fordi standardnivået rapporterte 358 funn som nesten alle gjaldt manglende annotasjoner i kode som er enkel med vilje. Første gang typesjekkeren kjørte, fant den en verdi som kunne være None, brukt som nøkkel i en ordbok, en feil Ruff hadde sluppet gjennom.

Hvor det går galt

Det meste av trøbbelet med Python kommer fra kode som tolken godtar uten å protestere, og som oppfører seg annerledes enn den leses.

En standardverdi husker tidligere kall. En funksjon returnerer en liste som fortsatt holder elementer fra tidligere kall, så resultatet avhenger av rekkefølgen kallene kommer i. En standardverdi evalueres én gang, når def-setningen kjører, så en muterbar standardverdi som en liste eller en ordbok er ett delt objekt for hvert kall som utelater argumentet. Bruk None som standardverdi og lag listen inne i funksjonskroppen; Ruff-regelen B006 melder fra om mønsteret.

def add_tag(tag, tags=None):
    if tags is None:
        tags = []  # a new list on every call
    tags.append(tag)
    return tags

Prosjektene ødelegger avhengighetene for hverandre. En oppgradering av et bibliotek for ett prosjekt knekker et annet, eller pip install stopper med en feil om et miljø som styres eksternt. Begge deler kommer av pakker som er installert rett i en delt tolk: prosjektene må dele én kopi av hvert bibliotek, og etter PEP 668 kan den som distribuerer et operativsystem, merke sin egen Python som forbudt område for pip. Gi hvert prosjekt sitt eget miljø med python -m venv .venv, installer i det, og skriv avhengighetene ned i en fil, slik at miljøet kan bygges på nytt.

Typehint blir stolt på som om de var sjekker. En funksjon som er annotert til å ta en int, får en streng fra en JSON-fil, og feilen dukker opp tre kall senere. Annotasjoner beskriver hensikt, og tolken håndhever dem ikke. Kjør en typesjekker som en del av kvalitetsporten, så avvik mellom annotert kode får bygget til å feile, og valider data der de kommer inn i programmet, fordi en annotasjon aldri kan gå god for inndata.

En tolk eldes ut av støtten. En server beholder versjonen den ble installert med, helt til sikkerhetsutgivelsene for den stopper og pakkene fjerner den fra området de støtter. Hver funksjonsversjon får fem år, og de fem årene for 3.10 var over 1. oktober 2026. Oppgi minsteversjonen i en fil som en sjekk leser, flytt opp innenfor de to årene med feilrettinger for hver utgivelse, og kjør testene på den nye versjonen før dere bytter.

Les mer

Ordliste