codeop
--- 编译 Python 代码¶
源代码: Lib/codeop.py
codeop
模块提供了可用于模拟 Python 读取-求值-打印 循环(REPL)的工具,就像 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¶
这个类的实例拥有
__call__()
方法,其签名与内置函数compile()
相同,但不同之处在于,如果实例编译了包含__future__
语句的程序文本,该实例会“记住”并在编译所有后续程序文本时强制应用该语句。
- class codeop.CommandCompiler¶
这个类的实例拥有
__call__()
方法,其签名与compile_command()
相同;不同之处在于,如果实例编译了包含__future__
语句的程序文本,该实例会“记住”并在编译所有后续程序文本时强制应用该语句。