Hoppa till innehållet

Python

språket som det mesta av webbplatsens verktyg är skrivet i

Vad det är

Python är ett allmänt programspråk vars källkod körs av en tolk i stället för att kompileras i förväg till en separat binär. Den egna dokumentationen kallar språket tolkat, interaktivt och objektorienterat, med moduler, undantag, dynamisk typning och datatyper på hög nivå inbyggda. Det drag som de flesta lägger märke till först är att indrag är syntax: ett block är det som står indraget under raden som öppnar det, så den layout läsaren ser är den struktur tolken kör. Guido van Rossum började på språket under julhelgerna 1989, med erfarenheter från arbetet på språket ABC vid CWI i Amsterdam, publicerade det i februari 1991 och döpte det efter manusen till Monty Pythons Flying Circus, som han läste vid den tiden.

Typningen är dynamisk. Ett namn binds till ett objekt medan programmet körs, och typen hör till objektet, inte till namnet, så samma variabel kan rymma ett tal på en rad och en sträng på nästa. Frivilliga annoteringar, standardiserade i PEP 484, låter en funktion ange vad den väntar sig och vad den returnerar, men den PEP:en säger uttryckligen att ingen typkontroll sker under körning och att Python förblir ett dynamiskt typat språk. Annoteringarna läses av separata verktyg, som typkontrollprogram och editorer, medan tolken sparar dem utan att upprätthålla dem.

Språket levereras med ett stort standardbibliotek, som handledningen beskriver med orden ”batteries included”: filer, JSON, SQLite, reguljära uttryck, underprocesser, tolkning av argument och mer, allt utan att installera något. Allt annat kommer som programpaket från tredje part, oftast installerade med pip från Python Package Index. Eftersom en tolk bara kan hålla en version av varje programpaket ingår också venv i standardbiblioteket. Det skapar en fristående miljö per projekt, så att ett program kan använda version 1.0 av ett bibliotek medan ett annat använder 2.0.

Nya versioner kommer enligt en kalender. Sedan Python 3.9 har PEP 602 gett en funktionsversion varje oktober efter ungefär sjutton månaders utveckling, och var och en underhålls i fem år. Från 3.13 och framåt betyder det två år med vanliga felrättningsversioner, ungefär varannan månad, och sedan tre år med enbart säkerhetsrättningar. Python 3.15.0 kom ut den 9 oktober 2026. Python 3.10 nådde slutet av sin livstid den 1 oktober 2026, och Python 2.7, den sista i den andra serien, slutade få stöd den 1 januari 2020. Referenstolken, CPython, har länge haft ett globalt tolklås, GIL, som bara låter en tråd i taget köra Python-kod. PEP 703 lade till ett bygge utan låset, och PEP 779 pekade ut 3.14 som tidsramen för den fas där det trådfria bygget har officiellt stöd men fortfarande är valfritt.

Varför det spelar roll

Python är ofta den kortaste vägen från en frågeställning till ett fungerande program. Ett skript som läser en fil, ställer en databasfråga och skriver en rapport kan skrivas med enbart standardbiblioteket, köras direkt och ändras utan något byggsteg. Därför hamnar språket så ofta som kittet i en datapipeline, i byggverktyg och i testmiljöer.

Läsbarheten är ett medvetet designmål och ingen bieffekt. The Zen of Python, PEP 20, slår fast att ”Readability counts”, och PEP 8, stilguiden för standardbiblioteket, avgör det som ett team annars skulle tvista om, från namngivning till raden på 79 tecken.

Flexibiliteten har ett pris, och det kommer sent. Ett felstavat attribut, ett None där en sträng väntades eller fel typ på ett argument blir ett fel först när just den raden körs, och det kan vara i produktion. Team som bygger något långlivat i Python lägger därför till de kontroller språket lämnar därhän: en linter, annoteringar med typkontroll i kvalitetsgrinden och tester som faktiskt kör kodvägarna.

Kalendern väger lika tungt som koden. Varje tolkversion har ett fast slutdatum, så en installation som ingen rör glider ut ur säkerhetsstödet enligt ett publicerat schema. Ett projekt som anger sin lägsta version och flyttar framåt inom de två åren med felrättningar byter en nödsituation mot en planerad uppgradering om året.

Så ser det ut i praktiken

I portfolion är Python språket bakom en databasdriven generator för CV och portfolio: 41 moduler och 10 580 rader som renderar sex utdataformat, från HTML och PDF till Markdown och JSON, ur en enda SQLite-databas med 23 tabeller. En kedja av 19 steg bygger databasen, och varje steg går att köra om utan risk. Beroendena vid körning hölls till exakt två, en mallmotor och en PDF-renderare, med argumentet att en dokumentgenerator som inte går att installera om fem år inte har bevarat någonting. Sidan anger också priset: dokumenten kommer numera bara ur Python-koden, och det finns inte längre någon fil att öppna och redigera i all hast.

Python vann också en direkt jämförelse i en datapipeline som summerar elförbrukning timme för timme. Den byggdes på tre sätt, i Python, i JQ och i SQL på PostgreSQL, för att göra om oregelbundna avläsningar till en rad per timme och zon, med nettoförbrukningen som produktion plus import minus export. Varianten som skrevs som rena Python-funktioner var snabbast och hanterade ett dygns data på 34 ms och ett dataset på 30 dagar på 180 ms.

Den här webbplatsen byggs av Hugo, en statisk webbplatsgenerator, och dess 22 hjälpskript, 8 408 rader sammanlagt, är skrivna i Python. Samtliga klarar sig med standardbiblioteket utom skriptet som importerar teckningar, som behöver Pillow för att beskära dem. Filen .tool-versions anger Python 3.14.7 med regeln att tolken får vara nyare men aldrig äldre, och task doctor prövar det mot den installerade binären i stället för att lita på filen. Ruff är lintern, och basedpyright granskar typer på nivån standard, eftersom den förvalda nivån rapporterade 358 fynd som nästan alla gällde saknade annoteringar i kod som är enkel med avsikt. Vid första körningen hittade typkontrollen ett värde som kunde vara None och som användes som nyckel i en dict, en defekt som Ruff hade släppt igenom utan anmärkning.

Var det går fel

Det mesta besväret med Python kommer från kod som tolken godtar utan protester och som beter sig annorlunda än den läses.

Ett standardargument minns tidigare anrop. En funktion returnerar en lista som fortfarande innehåller element från tidigare anrop, så resultatet beror på i vilken ordning anropen sker. Ett standardvärde beräknas en gång, när def-satsen körs, så ett föränderligt standardvärde som en lista eller en dict är ett och samma objekt för varje anrop som utelämnar argumentet. Använd None som standardvärde och skapa listan inne i funktionen. Ruffs regel B006 rapporterar mönstret.

def add_tag(tag, tags=None):
    if tags is None:
        tags = []  # en ny lista vid varje anrop
    tags.append(tag)
    return tags

Projekt förstör varandras beroenden. En uppgradering av ett bibliotek för ett projekt får ett annat att gå sönder, eller så stannar pip install med ett fel om en externt hanterad miljö. Båda beror på programpaket som installerats direkt i en delad tolk: projekten konkurrerar om en enda kopia av varje bibliotek, och enligt PEP 668 kan den som distribuerar ett operativsystem märka sin egen Python som förbjuden för pip. Ge varje projekt en egen miljö med python -m venv .venv, installera i den och skriv upp beroendena i en fil så att miljön går att bygga upp på nytt.

Typannoteringar behandlas som om de vore kontroller. En funktion som är annoterad för att ta emot en int får en sträng från en JSON-fil, och felet visar sig tre anrop senare. Annoteringar beskriver avsikt, och tolken upprätthåller dem inte. Kör typkontroll som en del av kvalitetsgrinden så att avvikelser mellan annoterad kod stoppar bygget, och validera data där de kommer in i programmet, eftersom en annotering aldrig kan gå i god för indata.

En tolk åldras ur sitt stöd. En server behåller den version den installerades med tills säkerhetsrättningarna för den upphör och programpaketen stryker den ur sina stödda versioner. Varje funktionsversion får fem år, och de fem åren för 3.10 tog slut den 1 oktober 2026. Ange den lägsta versionen i en fil som en kontroll läser, flytta upp inom de två åren med felrättningar för varje version och kör testsviten på den nya versionen innan du byter.

Läs mer

Ordlista