code
--- 解释器基类¶
源代码:Lib/code.py
code
模块提供了在 Python 中实现读取-求值-打印循环(read-eval-print loop)的功能。其中包含两个类和一些便捷函数,可用于构建提供交互式解释器提示符的应用程序。
- class code.InteractiveInterpreter(locals=None)¶
此类处理解析和解释器状态(用户的命名空间);它不处理输入缓冲、提示符或输入文件名(文件名总是显式传入)。可选的 locals 参数指定了一个映射,用作代码执行的命名空间;它默认为一个新创建的字典,其中键
'__name__'
的值设为'__console__'
,键'__doc__'
的值设为None
。请注意,在
InteractiveInterpreter
实例下创建的函数和类对象将属于 locals 指定的命名空间。只有当 locals 是现有模块的命名空间时,它们才是可序列化 (pickleable) 的。
- class code.InteractiveConsole(locals=None, filename='<console>', local_exit=False)¶
紧密地模拟交互式 Python 解释器的行为。这个类建立在
InteractiveInterpreter
之上,并增加了使用熟悉的sys.ps1
和sys.ps2
的提示功能以及输入缓冲。如果 local_exit 为真,在控制台中调用exit()
和quit()
将不会引发SystemExit
,而是返回到调用代码。在 3.13 版本发生变更: 添加了 local_exit 形参。
- code.interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=False)¶
运行读取-求值-打印循环的便捷函数。此函数会创建一个
InteractiveConsole
的新实例,如果提供了 readfunc,则将其设置为InteractiveConsole.raw_input()
方法。如果提供了 local,它将被传递给InteractiveConsole
构造函数,用作解释器循环的默认命名空间。如果提供了 local_exit,它将被传递给InteractiveConsole
构造函数。然后,该实例的interact()
方法会被调用,并将 banner 和 exitmsg 分别作为横幅和退出消息(如果提供的话)传入。控制台对象在使用后会被丢弃。在 3.6 版本发生变更: 增加了 exitmsg 参数。
在 3.13 版本发生变更: 添加了 local_exit 形参。
- code.compile_command(source, filename='<input>', symbol='single')¶
这个函数对于希望模拟 Python 解释器主循环(即读取-求值-打印循环)的程序很有用。棘手的部分在于确定用户何时输入了一个不完整的命令,可以通过输入更多文本来完成(而不是一个完整的命令或语法错误)。此函数几乎总能做出与真实解释器主循环相同的决定。
source 是源字符串;filename 是读取源的可选文件名,默认为
'<input>'
;symbol 是可选的语法起始符号,应为'single'
(默认值)、'eval'
或'exec'
。如果命令完整且有效,则返回一个代码对象(与
compile(source, filename, symbol)
相同);如果命令不完整,则返回None
;如果命令完整但包含语法错误,则引发SyntaxError
;如果命令包含无效的字面值,则引发OverflowError
或ValueError
。
交互式解释器对象¶
- 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
之外,所有异常都会被捕获,SystemExit
异常会被允许传播。关于
KeyboardInterrupt
的说明:这个异常可能会在此代码的其他地方发生,并且可能不总是被捕获。调用者应准备好处理它。
- InteractiveInterpreter.showsyntaxerror(filename=None)¶
显示刚刚发生的语法错误。这不会显示堆栈跟踪,因为语法错误没有堆栈跟踪。如果给定了 filename,它将被放入异常中,而不是 Python 解析器提供的默认文件名,因为从字符串读取时它总是使用
'<string>'
。输出由write()
方法写入。
- InteractiveInterpreter.showtraceback()¶
显示刚刚发生的异常。我们移除了第一个堆栈项,因为它位于解释器对象的实现内部。输出由
write()
方法写入。在 3.5 版本发生变更: 现在会显示完整的链式回溯,而不仅仅是主回溯。
- InteractiveInterpreter.write(data)¶
将一个字符串写入标准错误流(
sys.stderr
)。派生类应重写此方法,以根据需要提供适当的输出处理。
交互式控制台对象¶
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()¶
从输入缓冲区中移除任何未处理的源代码文本。