On this page
29.1. 代码-解释器 Base Class
code
模块提供了在 Python 中实现 read-eval-print 循环的Function。包括两个类和便利Function,可用于构建提供交互式解释器提示的应用程序。
-
- class *
code.
InteractiveInterpreter
([* locals *])
- 此类处理解析和解释器状态(用户的名称空间);它不处理 Importing 缓冲或提示或 Importing 文件命名(文件名始终显式传递)。可选的* locals *参数指定将在其中执行代码的字典;它默认为键
'__name__'
设置为'__console__'
且键'__doc__'
设置为None
的新创建的字典。
- class *
-
- class *
code.
InteractiveConsole
([* locals * [,文件名]])
- 紧密模拟交互式 Python 解释器的行为。此类基于InteractiveInterpreter构建,并使用熟悉的
sys.ps1
和sys.ps2
以及 Importing 缓冲添加提示。
- class *
code.
interact
([* banner * [,* readfunc * [,* local *]]])- 便利Function,可运行“读取评估打印”循环。这将创建一个新的InteractiveConsole实例,并将* readfunc 设置为InteractiveConsole.raw_input()方法(如果提供)。如果提供了 local ,则将其传递到InteractiveConsole构造函数以用作解释器循环的默认名称空间。然后,实例的interact()方法以 banner *作为横幅使用(如果提供的话)运行。控制台对象在使用后将被丢弃。
code.
compile_command
(源 [,文件名 [,符号]])- 对于想要模拟 Python 解释器主循环(也称为 read-eval-print 循环)的程序,此函数很有用。棘手的部分是确定用户何时 Importing 了不完整的命令,可以pass Importing 更多文本来完成该命令(而不是完整的命令或语法错误)。这个Function几乎(几乎)总是做出与真实解释器主循环相同的决定。
- source *是源字符串; * filename *是从中读取源的可选文件名,默认为
'<input>'
; * symbol *是可选的语法开始符号,应为'single'
(默认值)或'eval'
。
如果命令完整且有效,则返回一个代码对象(与compile(source, filename, symbol)
相同);否则,返回 0. None
如果命令不完整;如果命令完成并且包含语法错误,则引发SyntaxError;如果命令包含无效的 Literals,则引发OverflowError或ValueError。
29.1.1. 交互式口译对象
InteractiveInterpreter.
runsource
(源 [,文件名 [,符号]])- 在解释器中编译并运行某些源代码。参数与compile_command()相同; * filename 的默认值为
'<input>'
, symbol *的默认值为'single'
。可能发生以下几种情况:
- 在解释器中编译并运行某些源代码。参数与compile_command()相同; * filename 的默认值为
Importing 错误; compile_command()引发了一个异常(SyntaxError或OverflowError)。pass调用showsyntaxerror()方法将打印语法回溯。 runsource()返回
False
。Importing 不完整,需要更多 Importing; compile_command()返回了
None
。 runsource()返回True
。Importing 完成; compile_command()返回了代码对象。pass调用runcode()(也可以处理运行时异常,但SystemExit除外)来执行代码。 runsource()返回
False
。
该返回值可用于决定使用sys.ps1
还是sys.ps2
来提示下一行。
InteractiveInterpreter.
runcode
(* code *)- 执行一个代码对象。发生异常时,将调用showtraceback()来显示回溯。捕获所有 exception,但SystemExit除外,该 exception 可以传播。
关于KeyboardInterrupt的 Comments:此异常可能在此代码的其他地方发生,并不一定总是被捕获。呼叫者应准备好处理它。
InteractiveInterpreter.
showsyntaxerror
([文件名])- 显示刚发生的语法错误。这不会显示堆栈跟踪,因为语法错误没有一个。如果给定了* filename *,它将填充到异常中,而不是 Python 解析器提供的默认文件名,因为从字符串读取时,它始终使用
'<string>'
。输出passwrite()方法写入。
- 显示刚发生的语法错误。这不会显示堆栈跟踪,因为语法错误没有一个。如果给定了* filename *,它将填充到异常中,而不是 Python 解析器提供的默认文件名,因为从字符串读取时,它始终使用
InteractiveInterpreter.
showtraceback
( )- 显示刚刚发生的异常。我们删除第一个堆栈项,因为它在解释器对象实现中。输出passwrite()方法写入。
InteractiveInterpreter.
write
(* data *)- 将字符串写入标准错误流(
sys.stderr
)。派生类应重写此方法,以根据需要提供适当的输出处理。
- 将字符串写入标准错误流(
29.1.2. 交互式控制台对象
InteractiveConsole类是InteractiveInterpreter的子类,因此提供了解释器对象的所有方法以及以下附加内容。
InteractiveConsole.
interact
([* banner *])- 紧密模拟交互式 Python 控制台。可选的 banner 参数指定在第一次交互之前要打印的横幅。默认情况下,它会打印出类似于标准 Python 解释器打印的横幅,并在括号后加上控制台对象的类名(以免将其与真实的解释器混淆,因为它是如此接近!)。
InteractiveConsole.
push
(* line *)- 将一行源文本推到解释器。该行不应包含尾随换行符;它可能有内部换行符。该行将附加到缓冲区,并使用缓冲区的串联内容作为源来调用解释器的
runsource()
方法。如果这表明命令已执行或无效,则将缓冲区复位;否则,缓冲区将被清除。否则,该命令将不完整,并且在追加行之后将缓冲区保留为原来的状态。如果需要更多 Importing,则返回值为True
,如果以某种方式处理了该行,则返回值为False
(这与runsource()
相同)。
- 将一行源文本推到解释器。该行不应包含尾随换行符;它可能有内部换行符。该行将附加到缓冲区,并使用缓冲区的串联内容作为源来调用解释器的
InteractiveConsole.
resetbuffer
( )- 从 Importing 缓冲区中删除所有未处理的源文本。
InteractiveConsole.
raw_input
([提示])- 编写提示并阅读一行。返回的行不包含尾随换行符。当用户 ImportingEOF 键序列时,将引发EOFError。基本实现使用内置函数raw_input();子类可以用其他实现代替它。