# 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`，如果存在无效的字面值，则会引发`OverflowError`或`ValueError`。

  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__`语句的程序文本，则实例“记住”并用有效语句编译所有后续程序文本。