首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

codeop

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的兼容性,您可以编写它们

代码语言:javascript
复制
try:
    from codeop import CommandCompiler
    compile_command = CommandCompiler()
    del CommandCompiler
except ImportError:
    from codeop import compile_command

这是一个影响较小的更改,但会在程序中引入可能不需要的全局状态,或者可以编写:

代码语言:javascript
复制
try:
    from codeop import CommandCompiler
except ImportError:
    def CommandCompiler():
        from codeop import compile_command
        return compile_command

然后CommandCompiler每次需要一个新的编译器对象时调用它。

扫码关注腾讯云开发者

领取腾讯云代金券