# 30.1. `code` - 解释器基类

源代码： Lib / code.py

`code`模块提供了在Python中实现read-eval-print循环的功能。包括两个类和便利功能，其可以用于构建提供交互式解释器提示的应用。

class `code.``InteractiveInterpreter`(locals=None)

  None 可选的locals参数指定将在其中执行代码的字典；默认为新创建的字典，键`'__name__'`设置为`'__console__'`，键`'__doc__'`设置为`None`

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

  None 此类构建在`InteractiveInterpreter`上，并使用熟悉的`sys.ps1`和`sys.ps2`添加提示，并输入缓冲。

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

  便利功能运行读取 - 打印回路。这将创建`InteractiveConsole`的新实例，并将readfunc设置为`InteractiveConsole.raw_input()`方法（如果提供）。如果提供local，则会传递到`InteractiveConsole`构造函数，以用作解释器循环的默认命名空间。然后，实例的`interact()`方法将作为横幅广告使用的banner运行（如果提供）。控制台对象在使用后将被丢弃。

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

  这个函数对于想要模拟Python的解释器主循环（a.k.a.read-eval-print循环）。棘手的部分是确定用户何时输入了可以通过输入更多文本（而不是完整命令或语法错误）完成的不完整命令。此函数几乎总是做出与真实解释器主循环相同的决定。

  源是源字符串； filename是从中读取源的可选文件名，默认为`'<input>'`；和符号是可选的语法起始符号，应为`'single'`（默认值）或`'eval'`。

  如果命令完成，则返回一个代码对象（与`compile（source， filename， 符号）`和有效； `None`如果命令不完整；如果命令包含无效的字面值，则如果命令完成且包含语法错误，则引发`SyntaxError`，或引发`OverflowError`或`ValueError`

## 30.1.1. 交互式解释器对象

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

  在解释器中编译并运行一些源代码。参数与`compile_command()`相同； filename的默认值为`'<input>'`，符号的默认值为`'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)

  密切地模拟交互式Python控制台。可选的横幅参数指定在首次交互之前打印的横幅；默认情况下，它打印一个类似于标准Python解释器打印的横幅，后面是括号中的控制台对象的类名（以免混淆到真正的解释器 - 因为它非常接近！）。

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

`InteractiveConsole.``push`(line)

  将一行源文本推送到解释器。该行不应该有一个尾随换行符；它可能有内部换行符。该行被附加到缓冲区，并且解释器的`runsource()`方法以缓冲区的连接内容作为源来调用。如果这表示命令已执行或无效，则缓冲区复位；否则，命令不完整，并且缓冲区在添加行之后保留。如果需要更多输入，返回值为`True`，`False`如果以某种方式处理该行（这与`runsource()`

`InteractiveConsole.``resetbuffer`()

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

`InteractiveConsole.``raw_input`(prompt="")

  写一个提示并读一行。返回的行不包括尾随换行符。当用户输入EOF键序列时，会出现`EOFError`。基本实现从`sys.stdin`；子类可以用不同的实现来代替。