29.1. 代码-解释器 Base Class

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

    • class * code. InteractiveInterpreter([* locals *])
    • 此类处理解析和解释器状态(用户的名称空间);它不处理 Importing 缓冲或提示或 Importing 文件命名(文件名始终显式传递)。可选的* locals *参数指定将在其中执行代码的字典;它默认为键'__name__'设置为'__console__'且键'__doc__'设置为None的新创建的字典。
    • class * code. InteractiveConsole([* locals * [,文件名]])
    • 紧密模拟交互式 Python 解释器的行为。此类基于InteractiveInterpreter构建,并使用熟悉的sys.ps1sys.ps2以及 Importing 缓冲添加提示。
  • code. interact([* banner * [,* readfunc * [,* local *]]])

    • 便利Function,可运行“读取评估打印”循环。这将创建一个新的InteractiveConsole实例,并将* readfunc 设置为InteractiveConsole.raw_input()方法(如果提供)。如果提供了 local ,则将其传递到InteractiveConsole构造函数以用作解释器循环的默认名称空间。然后,实例的interact()方法以 banner *作为横幅使用(如果提供的话)运行。控制台对象在使用后将被丢弃。
  • code. compile_command( [,文件名 [,符号]])

    • 对于想要模拟 Python 解释器主循环(也称为 read-eval-print 循环)的程序,此函数很有用。棘手的部分是确定用户何时 Importing 了不完整的命令,可以pass Importing 更多文本来完成该命令(而不是完整的命令或语法错误)。这个Function几乎(几乎)总是做出与真实解释器主循环相同的决定。
  • source *是源字符串; * filename *是从中读取源的可选文件名,默认为'<input>'; * symbol *是可选的语法开始符号,应为'single'(默认值)或'eval'

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

29.1.1. 交互式口译对象

该返回值可用于决定使用sys.ps1还是sys.ps2来提示下一行。

  • InteractiveInterpreter. runcode(* code *)
    • 执行一个代码对象。发生异常时,将调用showtraceback()来显示回溯。捕获所有 exception,但SystemExit除外,该 exception 可以传播。

关于KeyboardInterrupt的 Comments:此异常可能在此代码的其他地方发生,并不一定总是被捕获。呼叫者应准备好处理它。

  • InteractiveInterpreter. showsyntaxerror([文件名])

    • 显示刚发生的语法错误。这不会显示堆栈跟踪,因为语法错误没有一个。如果给定了* filename *,它将填充到异常中,而不是 Python 解析器提供的默认文件名,因为从字符串读取时,它始终使用'<string>'。输出passwrite()方法写入。
  • InteractiveInterpreter. showtraceback ( )

    • 显示刚刚发生的异常。我们删除第一个堆栈项,因为它在解释器对象实现中。输出passwrite()方法写入。
  • InteractiveInterpreter. write(* data *)

    • 将字符串写入标准错误流(sys.stderr)。派生类应重写此方法,以根据需要提供适当的输出处理。

29.1.2. 交互式控制台对象

InteractiveConsole类是InteractiveInterpreter的子类,因此提供了解释器对象的所有方法以及以下附加内容。

  • InteractiveConsole. interact([* banner *])

    • 紧密模拟交互式 Python 控制台。可选的 banner 参数指定在第一次交互之前要打印的横幅。默认情况下,它会打印出类似于标准 Python 解释器打印的横幅,并在括号后加上控制台对象的类名(以免将其与真实的解释器混淆,因为它是如此接近!)。
  • InteractiveConsole. push(* line *)

    • 将一行源文本推到解释器。该行不应包含尾随换行符;它可能有内部换行符。该行将附加到缓冲区,并使用缓冲区的串联内容作为源来调用解释器的runsource()方法。如果这表明命令已执行或无效,则将缓冲区复位;否则,缓冲区将被清除。否则,该命令将不完整,并且在追加行之后将缓冲区保留为原来的状态。如果需要更多 Importing,则返回值为True,如果以某种方式处理了该行,则返回值为False(这与runsource()相同)。
  • InteractiveConsole. resetbuffer ( )

    • 从 Importing 缓冲区中删除所有未处理的源文本。
  • InteractiveConsole. raw_input([提示])

    • 编写提示并阅读一行。返回的行不包含尾随换行符。当用户 ImportingEOF 键序列时,将引发EOFError。基本实现使用内置函数raw_input();子类可以用其他实现代替它。