codeop — Kompilera Python-kod

Källkod: Lib/codeop.py


Modulen codeop tillhandahåller verktyg som Pythons read-eval-print-loop kan emuleras med, på samma sätt som görs i modulen code. Som ett resultat av detta vill du förmodligen inte använda modulen direkt; om du vill inkludera en sådan slinga i ditt program vill du förmodligen använda modulen code istället.

Det här jobbet består av två delar:

  1. Being able to tell if a line of input completes a Python statement: in short, telling whether to print ’>>>’ or ’...’ next.

  2. Kommer ihåg vilka framtida uttalanden som användaren har angett, så att efterföljande inmatning kan sammanställas med dessa som effekt.

Modulen codeop tillhandahåller ett sätt att göra var och en av dessa saker, och ett sätt att göra dem båda.

För att göra just det förstnämnda:

codeop.compile_command(source, filename='<input>', symbol='single')

Försöker kompilera källa, som ska vara en sträng med Python-kod och returnerar ett kodobjekt om källa är giltig Python-kod. I så fall kommer filnamnsattributet för kodobjektet att vara filnamn, vilket som standard är '<input>'. Returnerar None om källan inte är giltig Python-kod, men är ett prefix av giltig Python-kod.

Om det finns ett problem med källa, kommer ett undantag att uppstå. SyntaxError uppstår om det finns en ogiltig Python-syntax, och OverflowError eller ValueError om det finns en ogiltig bokstav.

Argumentet symbol avgör om källa kompileras som en sats ('single', standard), som en sekvens av statement ('exec') eller som ett expression ('eval'). Alla andra värden kommer att orsaka ValueError.

Anteckning

Det är möjligt (men inte troligt) att parsern slutar parsa med ett lyckat resultat innan den når slutet av källan; i så fall kan efterföljande symboler ignoreras istället för att orsaka ett fel. Till exempel kan en backslash följd av två nya streck följas av godtyckligt skräp. Detta kommer att åtgärdas när API:et för parsern är bättre.

class codeop.Compile

Instanser av denna klass har __call__()-metoder med samma signatur som den inbyggda funktionen compile(), men med skillnaden att om instansen kompilerar programtext som innehåller en __future__-sats, ”minns” instansen och kompilerar alla efterföljande programtexter med satsen i kraft.

class codeop.CommandCompiler

Instanser av denna klass har __call__()-metoder med samma signatur som compile_command(); skillnaden är att om instansen kompilerar programtext som innehåller en __future__-sats, ”minns” instansen och kompilerar alla efterföljande programtexter med satsen i kraft.