You are here:  Home » Python » – 编译Python代码 – 自定义Python解释器(Python教程)(参考资料)

codeop编译Python代码

源代码: Lib / codeop.py


codeop模块提供了Pythonread-eval-print循环可以使用的实用程序仿效,就像code模块中所做的那样。因此,您可能不希望直接使用该模块;如果你想在你的程序中包含这样一个循环,你可能想要使用code模块来代替

这个工作有两个部分:

  1. 能够判断是否一行输入完成一个Python语句:inshort,告诉是否打印’>>>‘或’...‘next.
  2. 记住用户输入的未来语句,所以后续输入可以用这些有效编译.

codeop模块提供了一种方法来完成这些事情,以及两种方法.

只做前者:

codeop.compile_commandsource, filename=”<input>”, symbol=”single”

尝试编译source,这应该是一段Python代码并返回acode对象,如果source是有效的Python代码。在这种情况下,代码对象的filenameattribute将是filename,默认为"<input>"。返回None如果sourcenot有效的Python代码,但是有效的Python代码的前缀.

如果source,会有例外.SyntaxError如果Python语法无效,则会引发,OverflowError要么 ValueError如果文字无效的话

symbol论证决定是否source编译为声明("single",默认值)或表达式"eval")。任何其他值都会导致ValueError被抬起

注意

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

class codeop.Compile

这个类的实例__call__()方法与内置函数签名相同compile(),但不同之处在于如果实例编译包含__future__语句的程序文本,则实例“记住”并编译所有后续程序文本,并附上有效声明.

class codeop.CommandCompiler

本课程的实例有__call__()签名与compile_command()相同的方法;不同之处在于,如果实例编译包含__future__语句的programtext,则实例’记住’并使用生效的语句编译所有后续程序文本.

评论被关闭。