code — 解释器基类

源代码: Lib/code.py


code 模块提供了在 Python 中实现读取-求值-打印循环的工具。其中包含两个类和便捷函数,可用于构建提供交互式解释器提示的应用程序。

class code.InteractiveInterpreter(locals=None)

此类处理解析和解释器状态(用户的命名空间);它不处理输入缓冲、提示或输入文件命名(文件名始终显式传入)。可选的 locals 参数指定一个映射,用作代码执行的命名空间;它默认为一个新创建的字典,其键 '__name__' 设置为 '__console__',键 '__doc__' 设置为 None

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

紧密模拟交互式 Python 解释器的行为。此类构建于 InteractiveInterpreter 之上,并添加了使用熟悉的 sys.ps1sys.ps2 进行提示和输入缓冲的功能。如果 local_exit 为 true,则控制台中的 exit()quit() 不会引发 SystemExit,而是返回到调用代码。

在 3.13 版本中更改: 添加了 local_exit 参数。

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

运行读取-求值-打印循环的便捷函数。这将创建一个新的 InteractiveConsole 实例,并将 readfunc 设置为用作 InteractiveConsole.raw_input() 方法(如果提供)。如果提供了 local,则将其传递给 InteractiveConsole 构造函数,以用作解释器循环的默认命名空间。如果提供了 local_exit,则将其传递给 InteractiveConsole 构造函数。然后,实例的 interact() 方法会运行,并将 bannerexitmsg 作为要使用的横幅和退出消息传递(如果提供)。控制台对象在使用后会被丢弃。

在 3.6 版本中更改: 添加了 exitmsg 参数。

在 3.13 版本中更改: 添加了 local_exit 参数。

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

此函数对于想要模拟 Python 解释器主循环(又称读取-求值-打印循环)的程序很有用。棘手的部分是确定用户何时输入了可通过输入更多文本完成的不完整命令(而不是完整命令或语法错误)。此函数几乎总是做出与实际解释器主循环相同的决定。

source 是源字符串;filename 是从中读取源的可选文件名,默认为 '<input>'symbol 是可选的语法起始符号,应为 'single' (默认值)、 'eval''exec'

如果命令完整且有效,则返回一个代码对象(与 compile(source, filename, symbol) 相同);如果命令不完整,则返回 None;如果命令完整且包含语法错误,则引发 SyntaxError,如果命令包含无效文字,则引发 OverflowErrorValueError

交互式解释器对象

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

在解释器中编译并运行一些源代码。参数与 compile_command() 相同;filename 的默认值为 '<input>'symbol 的默认值为 'single'。可能会发生以下几种情况之一:

返回值可用于决定是使用 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)。派生类应该覆盖此方法,以根据需要提供适当的输出处理。

交互式控制台对象

InteractiveConsole 类是 InteractiveInterpreter 的子类,因此除了以下新增内容外,还提供了解释器对象的所有方法。

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

紧密地模拟交互式 Python 控制台。可选的 *banner* 参数指定在第一次交互之前打印的横幅;默认情况下,它会打印一个类似于标准 Python 解释器打印的横幅,后面跟着控制台对象的类名(用括号括起来,以便不将其与真正的解释器混淆 - 因为它非常接近!)。

可选的 *exitmsg* 参数指定退出时打印的退出消息。传递空字符串以抑制退出消息。如果未给定 *exitmsg* 或 None,则会打印默认消息。

在 3.4 版本中变更: 要禁止打印任何横幅,请传递空字符串。

在 3.6 版本中变更: 退出时打印退出消息。

InteractiveConsole.push(line)

将一行源代码推送到解释器。该行不应包含尾随换行符;它可以包含内部换行符。该行被附加到一个缓冲区中,并使用缓冲区的连接内容作为源调用解释器的 runsource() 方法。如果这表明命令已执行或无效,则重置缓冲区;否则,命令未完成,并且缓冲区保留在附加该行后的状态。如果需要更多输入,则返回值为 True,如果该行以某种方式处理了(这与 runsource() 相同),则返回值为 False

InteractiveConsole.resetbuffer()

从输入缓冲区中删除任何未处理的源代码文本。

InteractiveConsole.raw_input(prompt='')

写入提示并读取一行。返回的行不包含尾随换行符。当用户输入 EOF 键序列时,会引发 EOFError。基本实现从 sys.stdin 读取;子类可以用不同的实现替换它。