30.1. 代码 — 解释器基类 — Python 文档
30.1. 代码 — 解释器基类
code
模块提供了在 Python 中实现 read-eval-print 循环的工具。 包括两个类和便利函数,可用于构建提供交互式解释器提示的应用程序。
- class code.InteractiveInterpreter(locals=None)
- 此类处理解析和解释器状态(用户的命名空间); 它不处理输入缓冲或提示或输入文件命名(文件名总是显式传入)。 可选的 locals 参数指定将在其中执行代码的字典; 它默认为新创建的字典,键
'__name__'
设置为'__console__'
,键'__doc__'
设置为None
。
- class code.InteractiveConsole(locals=None, filename='<console>')
- 密切模拟交互式 Python 解释器的行为。 此类基于 InteractiveInterpreter 并使用熟悉的
sys.ps1
和sys.ps2
添加提示,以及输入缓冲。
- code.interact(banner=None, readfunc=None, local=None, exitmsg=None)
运行读取-评估-打印循环的便捷功能。 这将创建 InteractiveConsole 的新实例,并设置 readfunc 用作 InteractiveConsole.raw_input() 方法(如果提供)。 如果提供 local,则将其传递给 InteractiveConsole 构造函数以用作解释器循环的默认命名空间。 然后运行实例的 interact() 方法,其中 banner 和 exitmsg 作为要使用的横幅和退出消息(如果提供)传递。 控制台对象在使用后被丢弃。
3.6 版更改: 添加 exitmsg 参数。
- code.compile_command(source, filename='<input>', symbol='single')
这个函数对于想要模拟 Python 解释器主循环(又名 读取-评估-打印循环)。 棘手的部分是确定用户何时输入了可以通过输入更多文本来完成的不完整命令(而不是完整的命令或语法错误)。 这个函数 almost 总是与真正的解释器主循环做出相同的决定。
source 是源字符串; filename 是读取源的可选文件名,默认为
'<input>'
; symbol 是可选的语法开始符号,它应该是'single'
(默认值)或'eval'
。如果命令完整且有效,则返回代码对象(与
compile(source, filename, symbol)
相同);None
如果命令不完整; 如果命令完成并包含语法错误,则引发 SyntaxError,如果命令包含无效文字,则引发 OverflowError 或 ValueError。
30.1.1. 交互式解释器对象
- InteractiveInterpreter.runsource(source, filename='<input>', symbol='single')
在解释器中编译并运行一些源代码。 参数与 compile_command() 相同; filename 的默认值为
'<input>'
,symbol 的默认值为'single'
。 可能会发生以下几种情况:输入不正确; compile_command() 引发异常(SyntaxError 或 OverflowError)。 将通过调用 showsyntaxerror() 方法打印语法回溯。 runsource() 返回
False
。输入不完整,需要更多输入; compile_command() 返回
None
。 runsource() 返回True
。输入完成; compile_command() 返回了一个代码对象。 该代码通过调用 runcode()(它也处理运行时异常,除了 SystemExit)来执行。 runsource() 返回
False
。
返回值可用于决定是否使用
sys.ps1
或sys.ps2
来提示下一行。
- InteractiveInterpreter.runcode(code)
执行代码对象。 发生异常时,会调用 showtraceback() 来显示回溯。 除了允许传播的 SystemExit 之外,所有异常都被捕获。
关于 KeyboardInterrupt 的说明:此异常可能发生在此代码的其他地方,并且可能并不总是被捕获。 调用者应该准备好处理它。
- InteractiveInterpreter.showsyntaxerror(filename=None)
- 显示刚刚发生的语法错误。 这不会显示堆栈跟踪,因为没有用于语法错误的堆栈跟踪。 如果给出了 filename,它会被填充到异常中,而不是 Python 解析器提供的默认文件名,因为它在读取字符串时总是使用
'<string>'
。 输出由 write() 方法写入。
- InteractiveInterpreter.showtraceback()
显示刚刚发生的异常。 我们删除第一个堆栈项,因为它在解释器对象实现中。 输出由 write() 方法写入。
3.5 版更改: 显示完整的链式回溯,而不仅仅是主回溯。
- InteractiveInterpreter.write(data)
- 将字符串写入标准错误流 (
sys.stderr
)。 派生类应该覆盖它以根据需要提供适当的输出处理。
30.1.2. 交互式控制台对象
InteractiveConsole 类是 InteractiveInterpreter 的子类,因此提供了解释器对象的所有方法以及以下附加内容。
- InteractiveConsole.interact(banner=None, exitmsg=None)
密切模拟交互式 Python 控制台。 可选的 banner 参数指定在第一次交互之前要打印的横幅; 默认情况下,它打印一个类似于标准 Python 解释器打印的横幅,后跟括号中的控制台对象的类名(以免与真正的解释器混淆——因为它太接近了!)。
可选的 exitmsg 参数指定退出时打印的退出消息。 传递空字符串以抑制退出消息。 如果未给出 exitmsg 或
None
,则打印默认消息。3.4 版更改: 要禁止打印任何横幅,请传递一个空字符串。
3.6 版更改: 退出时打印退出消息。
- InteractiveConsole.push(line)
- 将一行源文本推送给解释器。 该行不应有尾随换行符; 它可能有内部换行符。 该行被附加到缓冲区,并以缓冲区的连接内容作为源调用解释器的
runsource()
方法。 如果这表明命令已执行或无效,则重置缓冲区; 否则,该命令是不完整的,并且在附加该行之后缓冲区保持原样。 如果需要更多输入,则返回值为True
,如果以某种方式处理该行,则返回值为False
(这与runsource()
相同)。
- InteractiveConsole.resetbuffer()
- 从输入缓冲区中删除任何未处理的源文本。
- InteractiveConsole.raw_input(prompt=)
- 写一个提示并阅读一行。 返回的行不包括尾随的换行符。 当用户输入 EOF 键序列时,会引发 EOFError。 基本实现从
sys.stdin
读取; 子类可以用不同的实现替换它。