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.ps1
和sys.ps2
作为输入提示符,并有输入缓冲。
-
code.
interact
(banner=None, readfunc=None, local=None, exitmsg=None)¶ 运行一个 read-eval-print 循环的便捷函数。这会创建一个新的
InteractiveConsole
实例。如果提供了 readfunc ,会设置为InteractiveConsole.raw_input()
方法。如果提供了 local ,则将其传递给InteractiveConsole
的构造函数,以用作解释器循环的默认命名空间。然后,如果提供了 banner 和 exitmsg ,实例的interact()
方法会以此为标题和退出消息。控制台对象在使用后将被丢弃。在 3.6 版更改: 加入 exitmsg 参数。
-
code.
compile_command
(source, filename="<input>", symbol="single")¶ 这个函数主要用来模拟 Python 解释器的主循环(即 read-eval-print 循环)。难点的部分是当用户输入不完整命令时,判断能否通过之后的输入来完成(要么成为完整的命令,要么语法错误)。该函数 几乎 和实际的解释器主循环的判断是相同的。
source is the source string; filename is the optional filename from which source was read, defaulting to
'<input>'
; and symbol is the optional grammar start symbol, which should be either'single'
(the default) or'eval'
.如果命令完整且有效则返回一个代码对象 (等价于
compile(source, filename, symbol)
);如果命令不完整则返回None
;如果命令完整但包含语法错误则会引发SyntaxError
或OverflowError
而如果命令包含无效字面值则将引发ValueError
。
30.1.1. 交互解释器对象¶
-
InteractiveInterpreter.
runsource
(source, filename="<input>", symbol="single")¶ Compile and run some source in the interpreter. Arguments are the same as for
compile_command()
; the default for filename is'<input>'
, and for symbol is'single'
. One several things can happen:输入不正确;
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, exitmsg=None)¶ 近似地模拟交互式 Python 终端。 可选的 banner 参数指定要在第一次交互前打印的条幅;默认情况下会类似于标准 Python 解释器所打印的内容,并附上外加圆括号的终端对象类名(这样就不会与真正的解释器混淆 —— 因为确实太像了!)
可选的 exitmsg 参数指定要在退出时打印的退出消息。 传入空字符串可以屏蔽退出消息。 如果 exitmsg 未给出或为
None
,则将打印默认消息。在 3.4 版更改: 要禁止打印任何标志,请传递一个空字符串。
在 3.6 版更改: 退出时打印相关消息。
-
InteractiveConsole.
push
(line)¶ 将一行源文本推入解释器。 行内容不应带有末尾换行符;它可以有内部换行符。 行内容会被添加到一个缓冲区并且会调用解释器的
runsource()
方法,附带缓冲区内容的拼接结果作为源文本。 如果显示命令已执行或不合法,缓冲区将被重置;否则,则命令尚未结束,缓冲区将在添加行后保持原样。 如果要求更多输入则返回值为True
,如果行已按某种方式被处理则返回值为False
(这与runsource()
相同)。
-
InteractiveConsole.
resetbuffer
()¶ 从输入缓冲区中删除所有未处理的内容。