codeop — Python-Code kompilieren¶
Quellcode: Lib/codeop.py
Das Modul codeop stellt Dienstprogramme bereit, auf denen die Python Read-Eval-Print-Schleife emuliert werden kann, wie im Modul code geschehen. Daher möchten Sie das Modul wahrscheinlich nicht direkt verwenden; wenn Sie eine solche Schleife in Ihr Programm aufnehmen möchten, möchten Sie stattdessen wahrscheinlich das Modul code verwenden.
Diese Aufgabe besteht aus zwei Teilen:
Die Fähigkeit zu erkennen, ob eine Eingabezeile eine Python-Anweisung vervollständigt: kurz gesagt, zu erkennen, ob als nächstes „
>>>“ oder „...“ gedruckt werden soll.Sich zu merken, welche zukünftigen Anweisungen der Benutzer eingegeben hat, damit nachfolgende Eingaben mit diesen wirksam kompiliert werden können.
Das Modul codeop bietet eine Möglichkeit, jede dieser Aufgaben zu erledigen, und eine Möglichkeit, beide gleichzeitig zu erledigen.
Nur um das erstgenannte zu tun:
- codeop.compile_command(source, filename='<input>', symbol='single')¶
Versucht, source zu kompilieren, was eine Zeichenkette von Python-Code sein sollte, und gibt ein Code-Objekt zurück, wenn source gültiger Python-Code ist. In diesem Fall ist das Filename-Attribut des Code-Objekts filename, das standardmäßig
'<input>'ist. GibtNonezurück, wenn source *kein* gültiger Python-Code ist, aber ein Präfix von gültigem Python-Code darstellt.Wenn es ein Problem mit source gibt, wird eine Ausnahme ausgelöst.
SyntaxErrorwird ausgelöst, wenn eine ungültige Python-Syntax vorliegt, undOverflowErroroderValueError, wenn ein ungültiges Literal vorliegt.Das Argument symbol bestimmt, ob source als einzelne Anweisung (
'single', der Standardwert), als eine Sequenz von Anweisungen ('exec') oder als ein Ausdruck ('eval') kompiliert wird. Jeder andere Wert führt zum Auslösen vonValueError.Hinweis
Es ist möglich (aber unwahrscheinlich), dass der Parser vor dem Erreichen des Quelltextendes mit einem erfolgreichen Ergebnis stoppt; in diesem Fall können nachfolgende Symbole ignoriert werden, anstatt einen Fehler zu verursachen. Zum Beispiel kann ein Backslash gefolgt von zwei neuen Zeilen von beliebigem Müll gefolgt werden. Dies wird behoben, sobald die API für den Parser besser ist.
- class codeop.Compile¶
Instanzen dieser Klasse haben
__call__()-Methoden mit der gleichen Signatur wie die eingebaute Funktioncompile(), jedoch mit dem Unterschied, dass, wenn die Instanz Programmtext kompiliert, der eine__future__-Anweisung enthält, die Instanz sich daran „erinnert“ und alle nachfolgenden Programmtexte mit dieser Anweisung in Kraft kompiliert.
- class codeop.CommandCompiler¶
Instanzen dieser Klasse haben
__call__()-Methoden mit der gleichen Signatur wiecompile_command(); der Unterschied besteht darin, dass, wenn die Instanz Programmtext kompiliert, der eine__future__-Anweisung enthält, die Instanz sich daran „erinnert“ und alle nachfolgenden Programmtexte mit dieser Anweisung in Kraft kompiliert.