codeop

codeop - 编译Python代码

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

这项工作有两部分:

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

2. 记住用户已经输入了哪些未来的陈述,因此随后的输入可以用这些陈述进行编译。

codeop模块提供了一种做这些事情的方式,以及一种做这些事情的方式。

要做前者:

codeop.compile_command(source[, filename[, symbol]])

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

如果源存在问题,则会引发异常。 如果存在无效的Python语法,则会引发SyntaxError;如果存在无效的文字,则会引发OverflowError或ValueError。

所述符号参数确定是否被编译为一个声明('single'作为,缺省值)或表达式('eval')。任何其他价值都会导致ValueError提高。

注意

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

class codeop.Compile

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

class codeop.CommandCompiler

这个类别的实例具有__call__()与签名相同的方法compile_command( 不同之处在于,如果实例编译包含__future__语句的程序文本,那么该实例会'记住'并且使用有效的语句编译所有随后的程序文本。

关于版本兼容性的说明:Compile和CommandCompiler在Python 2.2中是新的。 如果您希望启用2.2的未来跟踪功能,并保持与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每次需要一个新的编译器对象时调用它。