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__'aufNonegesetzt.Beachten Sie, dass Funktionen und Klassenobjekte, die unter einer Instanz von
InteractiveInterpretererstellt 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
InteractiveInterpreterauf und fügt die Eingabeaufforderung hinzu, indem die vertrautensys.ps1undsys.ps2sowie die Eingabepufferung verwendet werden. Wenn local_exit wahr ist, lösenexit()undquit()in der Konsole keineSystemExitaus, 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
InteractiveConsoleund setzt readfunc, um als MethodeInteractiveConsole.raw_input()verwendet zu werden, falls vorhanden. Wenn local angegeben ist, wird es an den Konstruktor vonInteractiveConsoleübergeben, um als Standard-Namensraum für die Interpreter-Schleife verwendet zu werden. Wenn local_exit angegeben ist, wird es an den Konstruktor vonInteractiveConsoleübergeben. Die Methodeinteract()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östSyntaxErroraus, wenn der Befehl vollständig ist und einen Syntaxfehler enthält, oder löstOverflowErroroderValueErroraus, 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:Die Eingabe ist falsch;
compile_command()hat eine Ausnahme ausgelöst (SyntaxErroroderOverflowError). Ein Syntax-Traceback wird durch Aufruf der Methodeshowsyntaxerror()ausgegeben.runsource()gibtFalsezurück.Die Eingabe ist unvollständig, und weitere Eingaben sind erforderlich;
compile_command()gabNonezurück.runsource()gibtTruezurück.Die Eingabe ist vollständig;
compile_command()gab ein Code-Objekt zurück. Der Code wird durch Aufruf vonruncode()(der auch Laufzeitfehler behandelt, mit Ausnahme vonSystemExit) ausgeführt.runsource()gibtFalsezurück.
Der Rückgabewert kann verwendet werden, um zu entscheiden, ob
sys.ps1odersys.ps2zur 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ßerSystemExit, 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 Methodewrite()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
Noneist, 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 istTrue, wenn weitere Eingaben erforderlich sind,False, wenn die Zeile auf irgendeine Weise behandelt wurde (dies ist dasselbe wie beirunsource()).
- 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
EOFErrorausgelöst. Die Basisimplementierung liest vonsys.stdin; eine abgeleitete Klasse kann dies durch eine andere Implementierung ersetzen.