30.2. codeop
- 编译Python代码¶
源代码: Lib / codeop.py
codeop
模块提供了可以模拟Python read-eval-print循环的实用程序,如在code
模块中所做的那样。结果,你可能不想直接使用模块;如果你想在你的程序中包含这样一个循环,你可能想使用code
模块。
这个工作有两个部分:
- Being able to tell if a line of input completes a Python statement: in short, telling whether to print ‘
>>>
‘ or ‘...
‘ next. - 记住用户已经输入了哪些未来语句,因此后续输入可以用这些生效编译。
codeop
模块提供了一种执行这些操作的方法,以及一种执行这两种操作的方法。
做只是前者:
-
codeop.
compile_command
(source, filename="<input>", symbol="single")¶ 尝试编译源,它应是一个Python代码字符串,并且如果source是有效的Python代码,则返回一个代码对象。在这种情况下,代码对象的filename属性将为filename,默认为
'<input>'
。ReturnsNone
if source is not valid Python code, but is a prefix of valid Python code.如果源有问题,则会引发异常。如果有无效的Python语法,则会引发
SyntaxError
,如果存在无效的字面值,则会引发OverflowError
或ValueError
。The symbol argument determines whether source is compiled as a statement (
'single'
, the default) or as an expression ('eval'
). 任何其他值都会引起ValueError
。注意
可能(但不太可能)解析器在到达源结尾之前停止以成功结果进行语法分析;在这种情况下,可以忽略尾随符号,而不是引起错误。例如,反斜杠后跟两个换行符后面可能跟随任意的垃圾。一旦解析器的API更好,这将是固定的。
- class
codeop.
Compile
¶ 这个类的实例具有在声明中与内建函数
compile()
相同的__call__()
方法,但区别在于如果实例编译包含__future__
语句,实例“记住”并用所有生效的语句编译所有后续程序文本。
- class
codeop.
CommandCompiler
¶ 此类的实例具有与声明中相同的
__call__()
方法compile_command()
;区别在于,如果实例编译包含__future__
语句的程序文本,则实例“记住”并用有效语句编译所有后续程序文本。