4.4 内部类型

  • 代码

  • 跟踪记录

  • 切片

  • 省略

  • Xrange

我们在这里简要介绍一下这些内部类型,一般的程序员通常不会直接和这些对象打交道。不过为了这一章的完整性,我们还是在这里介绍一下它们。请参阅源代码或者Python的内部文档和在线文档来获得更详尽的信息。

你如果对异常感到迷惑的话,可以告诉你它们是用类来实现的。在老版本的Python中,异常是用字符串来实现的。

4.4.1 代码对象

代码对象是编译过的Python源代码片段,它是可执行对象。通过调用内建函数compile()可以得到代码对象。代码对象可以被exec命令或eval()内建函数来执行。在第14章将详细研究代码对象。

代码对象本身不包含任何执行环境信息,它是用户自定义函数的核心,在被执行时动态获得上下文。(事实上代码对象是函数的一个属性)一个函数除了有代码对象属性以外,还有一些其他函数必须的属性,包括函数名、文档字符串、默认参数、及全局命名空间等。

4.4.2 帧对象

帧对象表示Python的执行栈帧。帧对象包含Python解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名称空间字典及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个C栈帧。用到帧对象的一个地方是跟踪记录对象。

4.4.3 跟踪记录对象

当你的代码出错时,Python就会引发一个异常。如果异常未被捕获和处理,解释器就会退出脚本运行,显示类似下面的诊断信息。

4.4 内部类型 - 图1

当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。如果一个异常有自己的处理程序,处理程序就可以访问这个跟踪记录对象。

4.4.4 切片对象

当使用Python扩展的切片语法时,就会创建切片对象。扩展的切片语法允许对不同的索引切片操作,包括步进切片、多维切片和省略切片。多维切片语法是sequence[startl :endl,start2 : end2],或使用省略号,sequence[…,startl : end1 ]。切片对象也可以由内建函数 slice()来生成。步进切片允许利用第3个切片元素进行步进切片,它的语法为sequence[起始索引:结束索引:步进值]。Python很早就支持扩展步进切片语法了,但直到Python2.3以前都必须依靠C语言的API或Jython才能工作。下面是几个步进切片的例子。

4.4 内部类型 - 图2

4.4.5 省略对象

省略对象用于扩展切片语法中,起记号作用。这个对象在切片语法中表示省略号。类似Null对象 None,省略对象有一个唯一的名字Ellipsis,它的布尔值始终为True。

4.4.6 XRange对象

调用内建函数xrange()会生成一个Xrange对象,xrange()是内建函数range()的兄弟版本,用于需要节省内存使用或range()无法完成的超大数据集场合。在第8章你可以找到更多关于range()和xrange()的使用信息。