code — Basisklassen für Interpreter

Quellcode: Lib/code.py


Das Modul code stellt Einrichtungen zur Implementierung von Read-Eval-Print-Schleifen in Python bereit. Zwei Klassen und praktische Funktionen sind enthalten, die zum Erstellen von Anwendungen verwendet werden können, die eine interaktive Interpreter-Eingabeaufforderung bieten.

class code.InteractiveInterpreter(locals=None)

Diese Klasse kümmert sich um das Parsen und den Interpreterzustand (den Namensraum des Benutzers); sie kümmert sich nicht um Eingabepufferung, Eingabeaufforderungen oder die Benennung von Eingabedateien (der Dateiname wird immer explizit übergeben). Das optionale Argument locals gibt ein Mapping an, das als Namensraum für die Ausführung von Code verwendet werden soll; standardmäßig ist dies ein neu erstelltes Dictionary mit dem Schlüssel '__name__' auf '__console__' und dem Schlüssel '__doc__' auf None gesetzt.

Beachten Sie, dass Funktionen und Klassenobjekte, die unter einer Instanz von InteractiveInterpreter erstellt werden, zum durch locals angegebenen Namensraum gehören. Sie sind nur dann pickle-fähig, wenn locals der Namensraum eines vorhandenen Moduls ist.

class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)

Emuliert eng das Verhalten des interaktiven Python-Interpreters. Diese Klasse baut auf InteractiveInterpreter auf und fügt die Eingabeaufforderung hinzu, indem die vertrauten sys.ps1 und sys.ps2 sowie die Eingabepufferung verwendet werden. Wenn local_exit wahr ist, lösen exit() und quit() in der Konsole keine SystemExit aus, sondern kehren zum aufrufenden Code zurück.

Geändert in Version 3.13: Parameter local_exit hinzugefügt.

code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)

Praktische Funktion zum Ausführen einer Read-Eval-Print-Schleife. Dies erstellt eine neue Instanz von InteractiveConsole und setzt readfunc, um als Methode InteractiveConsole.raw_input() verwendet zu werden, falls vorhanden. Wenn local angegeben ist, wird es an den Konstruktor von InteractiveConsole übergeben, um als Standard-Namensraum für die Interpreter-Schleife verwendet zu werden. Wenn local_exit angegeben ist, wird es an den Konstruktor von InteractiveConsole übergeben. Die Methode interact() der Instanz wird dann mit banner und exitmsg als Banner und Ausstiegsnachricht ausgeführt, falls angegeben. Das Konsolenobjekt wird nach Gebrauch verworfen.

Geändert in Version 3.6: Parameter exitmsg hinzugefügt.

Geändert in Version 3.13: Parameter local_exit hinzugefügt.

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

Diese Funktion ist nützlich für Programme, die die Hauptschleife des Python-Interpreters (auch Read-Eval-Print-Schleife genannt) emulieren möchten. Der knifflige Teil besteht darin, festzustellen, wann der Benutzer einen unvollständigen Befehl eingegeben hat, der durch die Eingabe von mehr Text vervollständigt werden kann (im Gegensatz zu einem vollständigen Befehl oder einem Syntaxfehler). Diese Funktion trifft fast immer die gleiche Entscheidung wie die tatsächliche Hauptschleife des Interpreters.

source ist die Quellzeichenkette; filename ist der optionale Dateiname, aus dem die Quelle gelesen wurde, standardmäßig '<input>'; und symbol ist das optionale Grammatik-Startsymbol, das 'single' (der Standard), 'eval' oder 'exec' sein sollte.

Gibt ein Code-Objekt zurück (dasselbe wie compile(source, filename, symbol)), wenn der Befehl vollständig und gültig ist; None, wenn der Befehl unvollständig ist; löst SyntaxError aus, wenn der Befehl vollständig ist und einen Syntaxfehler enthält, oder löst OverflowError oder ValueError aus, wenn der Befehl ein ungültiges Literal enthält.

Objekte des interaktiven Interpreters

InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')

Kompiliert und führt einige Quellen im Interpreter aus. Die Argumente sind die gleichen wie bei compile_command(); der Standardwert für filename ist '<input>' und für symbol ist 'single'. Eines der folgenden Dinge kann passieren:

Der Rückgabewert kann verwendet werden, um zu entscheiden, ob sys.ps1 oder sys.ps2 zur Aufforderung für die nächste Zeile verwendet werden soll.

InteractiveInterpreter.runcode(code)

Kompiliert ein Code-Objekt. Wenn eine Ausnahme auftritt, wird showtraceback() aufgerufen, um einen Traceback anzuzeigen. Alle Ausnahmen werden abgefangen, außer SystemExit, die propagieren dürfen.

Eine Anmerkung zu KeyboardInterrupt: Diese Ausnahme kann an anderen Stellen in diesem Code auftreten und wird möglicherweise nicht immer abgefangen. Der Aufrufer sollte darauf vorbereitet sein, damit umzugehen.

InteractiveInterpreter.showsyntaxerror(filename=None)

Zeigt den gerade aufgetretenen Syntaxfehler an. Dies zeigt keinen Stack-Trace an, da es für Syntaxfehler keinen gibt. Wenn filename angegeben ist, wird es in die Ausnahme eingefügt, anstelle des Standarddateinamens, der vom Python-Parser bereitgestellt wird, da dieser beim Lesen aus einer Zeichenkette immer '<string>' verwendet. Die Ausgabe wird von der Methode write() geschrieben.

InteractiveInterpreter.showtraceback()

Zeigt die gerade aufgetretene Ausnahme an. Wir entfernen das erste Stack-Element, da es sich innerhalb der Implementierung des Interpreter-Objekts befindet. Die Ausgabe wird von der Methode write() geschrieben.

Geändert in Version 3.5: Der vollständige verkettete Traceback wird anstelle nur des primären Tracebacks angezeigt.

InteractiveInterpreter.write(data)

Schreibt eine Zeichenkette in den Standardfehlerstrom (sys.stderr). Abgeleitete Klassen sollten diese Methode überschreiben, um bei Bedarf die entsprechende Ausgabeverarbeitung bereitzustellen.

Objekte der interaktiven Konsole

Die Klasse InteractiveConsole ist eine Unterklasse von InteractiveInterpreter und bietet daher alle Methoden der Interpreter-Objekte sowie die folgenden Ergänzungen.

InteractiveConsole.interact(banner=None, exitmsg=None)

Emuliert eng die interaktive Python-Konsole. Das optionale Argument banner gibt das Banner an, das vor der ersten Interaktion gedruckt werden soll; standardmäßig wird ein Banner gedruckt, das dem des Standard-Python-Interpreters ähnelt, gefolgt vom Klassennamen des Konsolenobjekts in Klammern (um Verwechslungen mit dem echten Interpreter zu vermeiden – da es so ähnlich ist!).

Das optionale Argument exitmsg gibt eine Ausstiegsnachricht an, die beim Beenden gedruckt wird. Übergeben Sie eine leere Zeichenkette, um die Ausstiegsnachricht zu unterdrücken. Wenn exitmsg nicht angegeben ist oder None ist, wird eine Standardnachricht gedruckt.

Geändert in Version 3.4: Um das Drucken eines Banners zu unterdrücken, übergeben Sie eine leere Zeichenkette.

Geändert in Version 3.6: Beim Beenden wird eine Ausstiegsnachricht gedruckt.

InteractiveConsole.push(line)

Sendet eine Quelltextzeile an den Interpreter. Die Zeile sollte keinen abschließenden Zeilenumbruch haben; sie kann interne Zeilenumbrüche enthalten. Die Zeile wird an einen Puffer angehängt und die Methode runsource() des Interpreters wird mit dem verketteten Inhalt des Puffers als Quelle aufgerufen. Wenn dies darauf hindeutet, dass der Befehl ausgeführt oder ungültig war, wird der Puffer zurückgesetzt; andernfalls ist der Befehl unvollständig und der Puffer bleibt, wie er nach dem Anhängen der Zeile war. Der Rückgabewert ist True, wenn weitere Eingaben erforderlich sind, False, wenn die Zeile auf irgendeine Weise behandelt wurde (dies ist dasselbe wie bei runsource()).

InteractiveConsole.resetbuffer()

Entfernt jeglichen unbehandelten Quelltext aus dem Eingabepuffer.

InteractiveConsole.raw_input(prompt='')

Gibt eine Eingabeaufforderung aus und liest eine Zeile. Die zurückgegebene Zeile enthält keinen abschließenden Zeilenumbruch. Wenn der Benutzer die EOF-Tastenkombination eingibt, wird EOFError ausgelöst. Die Basisimplementierung liest von sys.stdin; eine abgeleitete Klasse kann dies durch eine andere Implementierung ersetzen.