1. Introduktion

Denna referenshandbok beskriver programmeringsspråket Python. Den är inte avsedd som en handledning.

Även om jag försöker vara så exakt som möjligt har jag valt att använda svenska snarare än formella specifikationer för allt utom syntax och lexikal analys. Detta bör göra dokumentet mer begripligt för den genomsnittlige läsaren, men lämnar utrymme för tvetydigheter. Om man kommer från Mars och försöker återimplementera Python enbart med hjälp av detta dokument, kan man därför bli tvungen att gissa sig till saker och ting, och i själva verket skulle man förmodligen implementera ett helt annat språk. Å andra sidan, om du använder Python och undrar vad de exakta reglerna för ett visst område av språket är, bör du definitivt kunna hitta dem här. Om du skulle vilja se en mer formell definition av språket, kanske du skulle kunna erbjuda din tid — eller uppfinna en kloningsmaskin :-).

Det är farligt att lägga till för många implementeringsdetaljer i ett språkreferensdokument — implementeringen kan ändras och andra implementeringar av samma språk kan fungera annorlunda. Å andra sidan är CPython den Python-implementation som används mest (även om alternativa implementationer fortsätter att få stöd), och dess speciella egenheter är ibland värda att nämnas, särskilt när implementationen innebär ytterligare begränsningar. Därför kommer du att hitta korta ”implementeringsanteckningar” utspridda i hela texten.

Varje Python-implementation levereras med ett antal inbyggda moduler och standardmoduler. Dessa finns dokumenterade i Pythons standardbibliotek. Några inbyggda moduler nämns när de interagerar på ett betydande sätt med språkdefinitionen.

1.1. Alternativa implementeringar

Även om det finns en Python-implementering som är den absolut mest populära, finns det några alternativa implementeringar som är av särskilt intresse för olika målgrupper.

Kända implementeringar inkluderar:

CPython

Detta är den ursprungliga och mest underhållna implementeringen av Python, skriven i C. Nya språkfunktioner visas vanligtvis här först.

Jython

Python implementerat i Java. Denna implementation kan användas som ett skriptspråk för Java-applikationer eller för att skapa applikationer med hjälp av Javas klassbibliotek. Det används också ofta för att skapa tester för Java-bibliotek. Mer information finns på the Jython website.

Python för .NET

Den här implementationen använder faktiskt CPython-implementationen, men är en hanterad .NET-applikation och gör .NET-bibliotek tillgängliga. Den har skapats av Brian Lloyd. Mer information finns på webbplatsen för Python for .NET.

IronPython

En alternativ Python för .NET. Till skillnad från Python.NET är detta en komplett Python-implementering som genererar IL och kompilerar Python-kod direkt till .NET-assemblies. Den skapades av Jim Hugunin, den ursprungliga skaparen av Jython. För mer information, se IronPythons webbplats.

PyPy

En implementering av Python som är helt skriven i Python. Den stöder flera avancerade funktioner som inte finns i andra implementationer, till exempel stöd för stackless och en Just in Time-kompilator. Ett av målen med projektet är att uppmuntra experimenterande med själva språket genom att göra det lättare att modifiera tolken (eftersom den är skriven i Python). Ytterligare information finns på PyPy-projektets webbplats.

Var och en av dessa implementationer skiljer sig på något sätt från språket som det dokumenteras i den här handboken, eller introducerar specifik information utöver vad som täcks av standarddokumentationen för Python. Se den implementationsspecifika dokumentationen för att avgöra vad mer du behöver veta om den specifika implementationen du använder.

1.2. Notation

I beskrivningarna av lexikal analys och syntax används en grammatisk notation som är en blandning av EBNF och PEG. Till exempel

name:   letter (letter | digit | "_")*
letter: "a"..."z" | "A"..."Z"
digit:  "0"..."9"

I detta exempel säger den första raden att ett ”namn” är en ”bokstav” följd av en sekvens av noll eller flera ”bokstavstecken”, ”siffertecken” och understrykningstecken. En ”bokstav” är i sin tur något av de enskilda tecknen ”a” till ”z” och ”A” till ”Z”; en ”siffra” är ett enskilt tecken från ”0” till ”9”.

Varje regel inleds med ett namn (som identifierar den regel som definieras) följt av ett kolon, :. Definitionen till höger om kolon använder följande syntaxelement:

  • name: Ett namn hänvisar till en annan regel. Om möjligt är det en länk till regelns definition.

    • TOKEN: Ett namn med versaler hänvisar till en token. När det gäller grammatikdefinitioner är tokens samma sak som regler.

  • "text", 'text': Text inom enkla eller dubbla citattecken måste matcha bokstavligen (utan citattecken). Typ av citat väljs beroende på betydelsen av text:

    • 'if': Ett namn inom enkla citattecken betecknar ett nyckelord.

    • "case": Ett namn inom dubbla citattecken betecknar ett mjukt nyckelord.

    • '@': En symbol som inte är en bokstav inom enkla citattecken betecknar en OP-token, det vill säga en delimiter eller operator.

  • e1 e2: Objekt som endast är åtskilda av blanksteg anger en sekvens. Här måste e1 följas av e2.

  • e1 | e2: En vertikal stapel används för att separera alternativ. Den betecknar PEG:s ”ordnade val”: om e1 matchar, beaktas inte e2. I traditionella PEG-grammatiker skrivs detta som ett snedstreck, /, snarare än en vertikal stapel. Se PEP 617 för mer bakgrund och detaljer.

  • e*: En stjärna betyder noll eller flera upprepningar av föregående punkt.

  • e+: På samma sätt betyder ett plus en eller flera upprepningar.

  • [e]: En fras inom hakparenteser betyder noll eller en förekomst. Med andra ord är den inneslutna frasen valfri.

  • e?: Ett frågetecken har exakt samma betydelse som hakparenteser: föregående punkt är valfri.

  • (e): Parenteser används för gruppering.

Följande notation används endast i lexikala definitioner.

  • "a"..."z": Två bokstavstecken åtskilda av tre punkter innebär att man kan välja vilket tecken som helst i det angivna (inkluderande) ASCII-teckenområdet.

  • <...>: En fras mellan vinkelparenteser ger en informell beskrivning av den matchade symbolen (t.ex. <any ASCII character except "\">) eller en förkortning som definieras i närliggande text (t.ex. <Lu>).

I vissa definitioner används också lookaheads, som anger att ett element måste (eller inte måste) matcha på en given position, men utan att konsumera någon input:

  • &e: en positiv lookahead (det vill säga, e måste matcha)

  • !e: en negativ lookahead (det vill säga, e måste inte matcha)

De unära operatorerna (*, +, ?) binder så hårt som möjligt; den vertikala stapeln (|) binder mest löst.

Vitt utrymme är endast meningsfullt för att separera tokens.

Reglerna står normalt på en rad, men om de är för långa kan de ombrytas:

literal: stringliteral | bytesliteral
         | integer | floatnumber | imagnumber

Alternativt kan reglerna formateras så att den första raden slutar med kolon och varje alternativ börjar med ett vertikalt streck på en ny rad. Till exempel

literal:
   | stringliteral
   | bytesliteral
   | integer
   | floatnumber
   | imagnumber

Detta betyder inte att det finns ett tomt första alternativ.

1.2.1. Lexikala och syntaktiska definitioner

Det finns en viss skillnad mellan lexikal och syntaktisk analys: lexical analyzer arbetar med de enskilda tecknen i inmatningskällan, medan parser (syntaktisk analysator) arbetar med den ström av tokens som genereras av den lexikala analysen. I vissa fall är dock den exakta gränsen mellan de två faserna en implementeringsdetalj i CPython.

Den praktiska skillnaden mellan de två är att i lexikala definitioner är alla blanksteg betydelsefulla. Den lexikala analysatorn discards alla blanksteg som inte omvandlas till tokens som token.INDENT eller NEWLINE. Syntaktiska definitioner använder sedan dessa tokens i stället för källtecken.

I denna dokumentation används samma BNF-grammatik för båda definitionstyperna. Alla användningar av BNF i nästa kapitel (Lexikalisk analys) är lexikala definitioner; användningar i efterföljande kapitel är syntaktiska definitioner.