29.2. codeop —编译 Python 代码

codeop模块提供 Util,可以在这些 Util 上模拟 Python read-eval-print 循环,就像在code模块中一样。结果,您可能不想直接使用该模块。如果要在程序中包含这样的循环,则可能要使用code模块。

这项工作分为两个部分:

codeop模块提供了完成所有这些操作的方法,以及同时完成这两项操作的方法。

要做前者:

如果* source *存在问题,将引发异常。如果使用无效的 Python 语法,则引发SyntaxError;如果使用无效的 Literals,则引发OverflowErrorValueError

Note

解析器有可能(但不太可能)在到达源末尾之前停止以成功结果进行解析;在这种情况下,尾随的符号可能会被忽略而不是引起错误。例如,反斜杠后跟两个换行符,后跟任意乱码。一旦解析器的 API 更好,此问题将得到修复。

关于版本兼容性的说明:CompileCommandCompiler是 Python 2.2 中的新增Function。如果要启用 2.2 的将来跟踪Function,但又要保持与 2.1 和 Python 早期版本的兼容性,则可以编写

try:
    from codeop import CommandCompiler
    compile_command = CommandCompiler()
    del CommandCompiler
except ImportError:
    from codeop import compile_command

这是一个影响很小的更改,但是可能会在程序中引入不必要的全局状态,或者您可以编写:

try:
    from codeop import CommandCompiler
except ImportError:
    def CommandCompiler():
        from codeop import compile_command
        return compile_command

然后在每次需要新的编译器对象时调用CommandCompiler

首页