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