Skip to main content

30.2. codeop —编译Python代码

源代码: Lib/codeop.py


codeop 模块提供了可以模拟Python读取 - 估计打印循环的实用程序,如在 code 模块中所做的那样。因此,您可能不想直接使用模块;如果你想在你的程序中包含这样一个循环,你可能想使用 code 模块。

这个工作有两个部分:

  1. 能够判断输入行是否完成了Python语句:简而言之,告诉下一步是打印“ >>> ”还是“ ... ”。

  2. 记住用户已经输入了哪些未来语句,因此后续输入可以用这些生效编译。

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

做只是前者:

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

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

如果 source 有问题,将引发异常。如果存在无效的Python语法,则引发 SyntaxError,并且如果存在无效的文本,则引发 OverflowErrorValueError

symbol 参数确定 source 是作为语句('single',默认)还是作为 expression'eval')编译。任何其他值将导致 ValueError 被提高。

注解

可能(但不太可能)解析器在到达源结尾之前停止以成功结果进行解析;在这种情况下,可以忽略尾随符号,而不是引起错误。例如,反斜杠后跟两个换行符后面可以跟随任意垃圾。一旦解析器的API更好,这将是固定的。

class codeop.Compile

这个类的实例具有与内置函数 compile() 相同签名的 __call__() 方法,但是区别在于,如果实例编译包含 __future__ 语句的程序文本,则实例“记住”并且用有效语句编译所有后续程序文本。

class codeop.CommandCompiler

这个类的实例具有与 compile_command() 相同的 __call__() 方法;区别在于,如果实例编译包含 __future__ 语句的程序文本,则实例将记住所有后续程序文本,并用有效的语句编译。