codeop ---编译python代码

源代码: Lib/codeop.py


这个 codeop 模块提供了一些实用程序,可以在这些实用程序上模拟python read eval print循环,如 code 模块。因此,您可能不想直接使用模块;如果您想在程序中包含这样的循环,您可能想使用 code 模块代替。

这项工作分为两部分:

  1. 能够判断一行输入是否完成了一条python语句:简而言之,指示是否打印' >>> “或” ... 下一步。

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

这个 codeop 模块提供了一种完成每一件事情的方法,以及同时完成这两件事情的方法。

只做前者:

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

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

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

The symbol argument determines whether source is compiled as a statement ('single', the default), as a sequence of statements ('exec') or as an expression ('eval'). Any other value will cause ValueError to be raised.

注解

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

class codeop.Compile

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

class codeop.CommandCompiler

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