Skip to main content

30.1. code —解释器基类

源代码: Lib/code.py


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.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的解释器主循环(即a.k.a. read-eval-print循环)的程序很有用。棘手的部分是确定用户何时输入了可以通过输入更多文本(而不是完整命令或语法错误)完成的不完整命令。此函数 almost 总是做出与真正的解释器主循环相同的决定。

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

如果命令完整和有效,则返回一个代码对象(与 compile(source, filename, symbol) 相同); None 如果命令不完整;如果命令完成并且包含语法错误,则提升 SyntaxError;如果命令包含无效的文本,则提高 OverflowErrorValueError

30.1.1. 交互式解释器对象

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)。派生类应该覆盖此,以根据需要提供适当的输出处理。

30.1.2. 交互式控制台对象

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 读取;子类可以用不同的实现来代替。