codeop — 编译 Python 代码

源代码: Lib/codeop.py


codeop 模块提供实用程序,可通过该实用程序模拟 Python 读-求值-打印循环,就像在 code 模块中所做的那样。因此,你可能不想直接使用该模块;如果你想在程序中包含这样的循环,那么你可能想改用 code 模块。

此项工作分为两部分

  1. 能够判断一行输入是否完成 Python 语句:简而言之,判断接下来是打印 >>> 还是 ...

  2. 记住用户输入了哪些 future 语句,以便后续输入可以编译并生效。

codeop 模块提供了一种执行这两项操作的方法,以及一种同时执行这两项操作的方法。

仅执行前者

codeop.compile_command(source, filename='<input>', symbol='single')

尝试编译 source,它应该是 Python 代码的字符串,如果 source 是有效的 Python 代码,则返回一个代码对象。在这种情况下,代码对象的 filename 属性将是 filename,其默认值为 '<input>'。如果 source 不是 有效的 Python 代码,但它是有效 Python 代码的前缀,则返回 None

如果 source 有问题,则会引发异常。如果 Python 语法无效,则会引发 SyntaxError;如果无效的文字,则会引发 OverflowErrorValueError

symbol 参数确定是否将 source 编译为语句('single',默认值)、语句 序列('exec')或 表达式'eval')。任何其他值都会导致引发 ValueError

注意

解析器有可能(但不太可能)在解析成功之前就停止解析,而未到达源的末尾;在这种情况下,可能会忽略尾随符号,而不是导致错误。例如,反斜杠后跟两个换行符,后面可能会跟任意垃圾。一旦解析器的 API 变得更好,这个问题将得到解决。

class codeop.Compile

此类的实例具有与内置函数 compile() 签名相同的 __call__() 方法,但不同之处在于,如果实例编译包含 __future__ 语句的程序文本,则该实例会“记住”并编译所有后续包含该语句的程序文本。

class codeop.CommandCompiler

此类的实例具有与 compile_command() 签名相同的 __call__() 方法;不同之处在于,如果实例编译包含 __future__ 语句的程序文本,则该实例会“记住”并编译所有后续包含该语句的程序文本。