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)¶ 便利功能运行读取 - 评估打印循环。这将创建
InteractiveConsole
的新实例,并设置 readfunc 以用作InteractiveConsole.raw_input()
方法(如果提供)。如果提供 local,它将被传递给InteractiveConsole
构造函数,以用作解释器循环的缺省命名空间。然后,使用 banner 和 exitmsg 作为横幅和退出消息(如果提供)来运行实例的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
;如果命令包含无效的文本,则提高OverflowError
或ValueError
。
30.1.1. 交互式解释器对象¶
-
InteractiveInterpreter.
runsource
(source, filename="<input>", symbol="single")¶ 在解释器中编译并运行一些源代码。参数与
compile_command()
相同; filename 的默认值为'<input>'
,symbol 的默认值为'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, exitmsg=None)¶ 密切地模拟交互式Python控制台。可选的 banner 参数指定在第一次交互之前打印的横幅;默认情况下,它打印一个类似于标准Python解释器打印的横幅,然后在括号中显示控制台对象的类名(以免与真正的解释器混淆 - 因为它非常接近!)。
可选的 exitmsg 参数指定退出时打印的退出消息。传递空字符串以抑制退出消息。如果未给出 exitmsg 或
None
,则会打印默认消息。在 3.4 版更改: 要禁止打印任何横幅,请传递一个空字符串。
在 3.6 版更改: 退出时打印退出消息。
-
InteractiveConsole.
push
(line)¶ 将一行源文本推送到解释器。该行不应该有一个尾随换行符;它可能有内部换行符。该行被附加到缓冲区,并且解释器的
runsource()
方法被调用,并且缓冲区的连接内容作为源。如果这表示命令已执行或无效,则缓冲区复位;否则,命令不完整,并且缓冲区在添加行之后保留。如果需要更多输入,返回值为True
,如果以某种方式处理该行,则返回False
(这与runsource()
相同)。
-
InteractiveConsole.
resetbuffer
()¶ 从输入缓冲区中删除任何未处理的源文本。