code — 解释器基类

源代码: Lib/code.py


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

class code.InteractiveInterpreter(locals=None)

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

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

紧密模拟交互式 Python 解释器的行为。此类基于 InteractiveInterpreter 构建,并使用熟悉的 sys.ps1sys.ps2 以及输入缓冲添加提示。

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

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

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

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

此函数对于希望模拟 Python 解释器主循环(又名读取-评估-打印循环)的程序非常有用。棘手之处在于确定用户何时输入了可以通过输入更多文本来完成的不完整命令(与完整命令或语法错误相反)。此函数几乎总是与真正的解释器主循环做出相同的决定。

source 是源字符串;filename 是从中读取 source 的可选文件名,默认为 '<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 参数指定退出时打印的退出消息。传递空字符串以禁止退出消息。如果未给出 exitmsgNone,则打印默认消息。

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

3.6 版本中已更改: 退出时打印退出消息。

InteractiveConsole.push(line)

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

InteractiveConsole.resetbuffer()

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

InteractiveConsole.raw_input(prompt='')

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