code --- 解释器基类

源代码:Lib/code.py


code 模块提供了在 Python 中实现读取-求值-打印循环(read-eval-print loop)的功能。其中包含两个类和一些便捷函数,可用于构建提供交互式解释器提示符的应用程序。

class code.InteractiveInterpreter(locals=None)

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

请注意,在 InteractiveInterpreter 实例下创建的函数和类对象将属于 locals 指定的命名空间。只有当 locals 是现有模块的命名空间时,它们才是可序列化 (pickleable) 的。

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

紧密地模拟交互式 Python 解释器的行为。这个类建立在 InteractiveInterpreter 之上,并增加了使用熟悉的 sys.ps1sys.ps2 的提示功能以及输入缓冲。如果 local_exit 为真,在控制台中调用 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 之外,所有异常都会被捕获,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;如果该行已以某种方式处理,则返回 False(这与 runsource() 相同)。

InteractiveConsole.resetbuffer()

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

InteractiveConsole.raw_input(prompt='')

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