30.2. codeop
—编译Python代码¶
源代码: Lib/codeop.py
codeop
模块提供了可以模拟Python读取 - 估计打印循环的实用程序,如在 code
模块中所做的那样。因此,您可能不想直接使用模块;如果你想在你的程序中包含这样一个循环,你可能想使用 code
模块。
这个工作有两个部分:
能够判断输入行是否完成了Python语句:简而言之,告诉下一步是打印“
>>>
”还是“...
”。记住用户已经输入了哪些未来语句,因此后续输入可以用这些生效编译。
codeop
模块提供了一种执行这些操作的方法,以及一种执行这两种操作的方法。
做只是前者:
-
codeop.
compile_command
(source, filename="<input>", symbol="single")¶ 尝试编译 source,它应该是一个Python代码字符串,并返回一个代码对象,如果 source 是有效的Python代码。在这种情况下,代码对象的filename属性将是 filename,默认为
'<input>'
。如果 source 是 not 有效的Python代码,则返回None
,但是是有效的Python代码的前缀。如果 source 有问题,将引发异常。如果存在无效的Python语法,则引发
SyntaxError
,并且如果存在无效的文本,则引发OverflowError
或ValueError
。symbol 参数确定 source 是作为语句(
'single'
,默认)还是作为 expression ('eval'
)编译。任何其他值将导致ValueError
被提高。注解
可能(但不太可能)解析器在到达源结尾之前停止以成功结果进行解析;在这种情况下,可以忽略尾随符号,而不是引起错误。例如,反斜杠后跟两个换行符后面可以跟随任意垃圾。一旦解析器的API更好,这将是固定的。
-
class
codeop.
Compile
¶ 这个类的实例具有与内置函数
compile()
相同签名的__call__()
方法,但是区别在于,如果实例编译包含__future__
语句的程序文本,则实例“记住”并且用有效语句编译所有后续程序文本。
-
class
codeop.
CommandCompiler
¶ 这个类的实例具有与
compile_command()
相同的__call__()
方法;区别在于,如果实例编译包含__future__
语句的程序文本,则实例将记住所有后续程序文本,并用有效的语句编译。