codeop
---编译python代码¶
源代码: Lib/codeop.py
这个 codeop
模块提供了一些实用程序,可以在这些实用程序上模拟python read eval print循环,如 code
模块。因此,您可能不想直接使用模块;如果您想在程序中包含这样的循环,您可能想使用 code
模块代替。
这项工作分为两部分:
能够判断一行输入是否完成了一条python语句:简而言之,指示是否打印'
>>>
“或”...
下一步。记住用户已经输入了哪些未来的语句,因此可以使用这些语句编译后续的输入。
这个 codeop
模块提供了一种完成每一件事情的方法,以及同时完成这两件事情的方法。
只做前者:
- codeop.compile_command(source, filename='<input>', symbol='single')¶
尝试编译 source ,它应该是一个字符串python代码,并返回一个代码对象,如果 source 是有效的python代码。在这种情况下,代码对象的文件名属性将是 filename ,默认为
'<input>'
. 返回None
如果 source 是 not 有效的python代码,但是有效python代码的前缀。如果有问题 source 将引发异常。
SyntaxError
如果存在无效的python语法,则引发,并且OverflowError
或ValueError
如果存在无效的文本。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 causeValueError
to be raised.注解
解析器可能(但不太可能)在到达源的末尾之前停止解析并获得成功的结果;在这种情况下,可以忽略尾随符号而不是导致错误。例如,一个反斜杠后面跟着两个换行符,后面跟着任意垃圾。一旦解析器的API更好,这将被修复。
- class codeop.Compile¶
此类的实例具有
__call__()
方法的签名与内置函数相同compile()
但不同的是,如果实例编译的程序文本包含__future__
语句,实例“记住”并编译所有后续程序文本,使语句生效。
- class codeop.CommandCompiler¶
此类的实例具有
__call__()
方法的签名与相同compile_command()
;区别在于,如果实例编译包含__future__
语句,实例“记住”并编译所有后续程序文本,使语句生效。