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
每次需要一个新的编译器对象时调用它。