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.ps1
和sys.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
,或引发OverflowError
或ValueError
30.1.1. Interactive Interpreter Objects¶
-
InteractiveInterpreter.
runsource
(source, filename="<input>", symbol="single")¶ 在解释器中编译并运行一些源代码。参数与
compile_command()
相同; filename的默认值为'<input>'
,符号的默认值为'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. Interactive Console Objects¶
InteractiveConsole
类是InteractiveInterpreter
的子类,因此提供了解释器对象的所有方法以及以下添加项。
-
InteractiveConsole.
interact
(banner=None)¶ 密切地模拟交互式Python控制台。可选的横幅参数指定在首次交互之前打印的横幅;默认情况下,它打印一个类似于标准Python解释器打印的横幅,后面是括号中的控制台对象的类名(以免混淆到真正的解释器 - 因为它非常接近!)。
在版本3.4中更改:要禁止打印任何横幅,请传递一个空字符串。
-
InteractiveConsole.
push
(line)¶ 将一行源文本推送到解释器。该行不应该有一个尾随换行符;它可能有内部换行符。该行被附加到缓冲区,并且解释器的
runsource()
方法以缓冲区的连接内容作为源来调用。如果这表示命令已执行或无效,则缓冲区复位;否则,命令不完整,并且缓冲区在添加行之后保留。The return value isTrue
if more input is required,False
if the line was dealt with in some way (this is the same asrunsource()
).
-
InteractiveConsole.
resetbuffer
()¶ 从输入缓冲区中删除任何未处理的源文本。