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.ps1sys.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,或引发OverflowErrorValueError

30.1.1. 交互式解释器对象

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

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

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

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

InteractiveConsole.push(line)

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

InteractiveConsole.resetbuffer()

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

InteractiveConsole.raw_input(prompt="")

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