30.2. codeop - 编译Python代码

源代码: Lib / codeop.py

codeop模块提供了可以模拟Python read-eval-print循环的实用程序,如在code模块中所做的那样。结果,你可能不想直接使用模块;如果你想在你的程序中包含这样一个循环,你可能想使用code模块。

这个工作有两个部分:

  1. 判断一行Python语句输入是否完成了:简而言之,在后面打印‘>>>‘或者 ‘...‘ 。
  2. 记住用户已经输入了哪些未来语句,因此后续输入可以用这些生效编译。

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

做只是前者:

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

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

如果有问题,则会引发异常。如果有无效的Python语法,则会引发SyntaxError,如果存在无效的字面值,则会引发OverflowErrorValueError

The symbol argument determines whether source is compiled as a statement ('single', the default) or as an expression ('eval'). 任何其他值都会引起ValueError

注意

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

class codeop.Compile

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

class codeop.CommandCompiler

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