codeop — 编译 Python 代码 — Python 文档
来自菜鸟教程
Python/docs/3.8/library/codeop
codeop — 编译 Python 代码
codeop 模块提供了可以模拟 Python read-eval-print 循环的实用程序,就像在 code 模块中所做的那样。 因此,您可能不想直接使用该模块; 如果你想在你的程序中包含这样一个循环,你可能想使用 code 模块来代替。
这项工作有两个部分:
- 能够判断一行输入是否完成了 Python 语句:简而言之,判断接下来是打印 '
>>>
' 还是 '...
'。 - 记住用户输入了哪些未来的语句,以便后续的输入可以在这些语句生效的情况下进行编译。
codeop 模块提供了一种方法来完成这些事情中的每一个,以及一种同时完成它们的方法。
只做前者:
- codeop.compile_command(source, filename='<input>', symbol='single')
尝试编译 source,它应该是一串 Python 代码,如果 source 是有效的 Python 代码,则返回一个代码对象。 在这种情况下,代码对象的文件名属性将为 文件名 ,默认为
'<input>'
。 如果 source 是 不是 有效的 Python 代码,但它是有效 Python 代码的前缀,则返回None
。如果source有问题,会抛出异常。 SyntaxError 如果 Python 语法无效,则会引发 OverflowError 或 ValueError 如果存在无效文字。
symbol 参数确定是将 source 编译为语句(
'single'
,默认值)、语句序列('exec'
)或编译为 表达式 ('eval'
)。 任何其他值都会导致 ValueError 被引发。笔记
解析器有可能(但不太可能)在到达源的末尾之前停止解析并获得成功的结果; 在这种情况下,可以忽略尾随符号而不是导致错误。 例如,反斜杠后跟两个换行符可能后跟任意垃圾。 一旦解析器的 API 更好,这将得到修复。
- class codeop.Compile
- 此类的实例具有与内置函数 compile() 签名相同的
__call__()
方法,但不同之处在于,如果实例编译包含 __future__ 的程序文本] 语句,实例“记住”并编译所有后续程序文本,并使用有效的语句。
- class codeop.CommandCompiler
- 此类的实例具有与 compile_command() 签名相同的
__call__()
方法; 不同之处在于,如果实例编译包含__future__
语句的程序文本,则实例会“记住”并使用有效的语句编译所有后续程序文本。