Python解释器的探讨:第一部分函数对象

Python解释器的探讨:第一部分函数对象

最近三个月,我和Ned Batchelder花费了大量时间在开发byterun。这个项目byterun(https://github.com/nedbat/byterun)是使用python开发的python字节码的解释器。开发解释器byterun过程中,让我学习到很多东西,以及带来很大的乐趣。在本文系列里,我将带你来体验一下我的开发乐趣,以及使用byterun是非常高兴的事情。不过,在体验快乐之前,先要理解一些基础的知识,就像做运动之前先来暖身一下:对python内部实现有一个整体的了解,以便我们知道解释器是什么东西,它做什么用的,它不能做什么。

本文假定你知道有python这个东西,跟我三个月以前是一样的,除了这个什么都不知道,别说什么python内部实现了。

值得注意的是:本文主要关注和讨论的都是在python2.7版本基础上进行。其实python3.0版本的解释器也差不了太多,与前面版本类似。主要是一些语法和命名不同样,基于底层的内容完全是可以往python3.0版本进行套用的。

python是怎么样工作呢?

我们将从高级的交互界面开始来了解python内部是怎么样工作的。当你在python的交互解释器里输入一行代码,然后运行它,那解释器在做了些什么呢?

~ $ python

Python 2.7.2 (default, Jun 20 2012, 16:23:33)

[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> a = "hello"

当你输入那行代码之后,按下回车键时,这时python解释器发生了四件事情:词法分析、语法分析、编译生成字节码和解释执行字节码。词法分析做的事情就是把你输入的代码分析之后,生成一个一个的单词(token)。语法分析做的事情就是分析这些单词,然后根据单词之间相互的关系生成一个合适表达它们之间关系的结构(在这里是生成AST抽象语法树)。编译生成代码阶段就是把AST结构生成一个或多个代码对象,而代码对象里已经变成字节码和数据。最后,解释执行阶段把每个代码对象里的字节码进行运行。

在今天本文里,我不打算讨论词法分析、语法分析或编译生成代码,因为对这些阶段过程,我都不懂,没办法通过我的语言表达出来。反而我假定这些都运行正确,并且能够生成合适的python代码对象,以便给解释器进行运行。

在我们讨论代码对象之前,先来进行一些综合的背景知识介绍。在本文系列文章里,我们将会讨论函数对象、代码对象和字节码。这三者之间是完全不同的,接着下来先会讨论函数对象。虽然不理解函数对象也可以理解解释器的内部功能,但是我想要强调的是函数对象和代码是两个不同的东西,函数对象更加特别一些。

函数对象

你也许经常听说到函数对象,因为人们经常谈论它们,比如说“函数对象是最重要的一类对象”或者“python代码主要由函数对象构成”。来,让我们先看看函数对象长得怎么样:

>>> def foo(a):

...     x = 3

...     return x + a

...

>>> foo

<function foo at 0x107ef7aa0>

“函数对象是最重要的一类对象”的意思就是说函数是对象,不仅像list对象或者MyObject对象一样。由于foo是一个函数对象,因此可以直接使用foo,而不必调用它运行(应理解foo和foo()之间差别)。我们可以把foo作一个参数传递给函数使用,或者把函数对象赋值给另一个变量(命名,other_function = foo)。由于函数作为一类对象来对待,那么很多功能与普通对象是一样的。

在第二部分,我们将讨论更低级的代码对象。

参考:

http://akaptur.com/blog/2013/11/15/introduction-to-the-python-interpreter/

蔡军生 QQ:9073204 深圳

时间: 2024-08-01 16:15:39

Python解释器的探讨:第一部分函数对象的相关文章

Python解释器的探讨:第二部分代码对象

本文是python解释器系列文章的一部分,第一部分文章请看这里: http://blog.csdn.net/caimouse/article/details/47342357 从第一部分文章里可知,主要分析了一下函数对象相关的内容.本文里继续深入分析python解析器相关内容,主要分析函数的代码对象. >>> def foo(a): ...     x = 3 ...     return x + a ... >>> foo <function foo at 0x

《python解释器源码剖析》第3章--python中的字符串对象

3.0 序 我们知道python中的字符串属于变长对象,当然和int也是一样,底层的结构体实例所维护的数据的长度,在对象没有定义的时候是不知道的.当然如果是python2的话,底层PyIntObject维护的就是一个long,显然在没创建的时候就知道是1. 可变对象维护的数据的长度只能在对象创建的时候才能确定,举个例子,我们只能在创建一个字符串或者列表时,才知道它们所维护的数据的长度,在此之前,我们对此是一无所知的. 注意我们在前面提到过可变对象和不可变对象的区别,在变长对象中,实际上也可以分为

《python解释器源码剖析》第4章--python中的list对象

4.0 序 python中的list对象,底层对应的则是PyListObject.如果你熟悉C++,那么会很容易和C++中的list联系起来.但实际上,这个C++中的list大相径庭,反而和STL中的vector比较类似 4.1 PyListObject对象 我们知道python里面的list对象是支持对元素进行增删改查等操作的,list对象里面存储的,底层无一例外都是PyObject * 指针.所以实际上我们可以这样看待python底层的PyListObject:vector<PyObject

详解python解释器安装以及简单的python入门第一步

1.首先要有一个python解释器,如果不知道在哪里下载的话,大家可以去我的博客里下载,免费的.安装很简单,我已经安装过了就不给大家演示了. 2.下图是安装完成之后的 3.接下来是配置系统环境变量,大家可以看我的上一篇博客是如何配置系统环境变量的,配置完成之后如下图,注:我这里只有一个环境变量,如果你的是多个,就直接用:号隔开直接在后面追加就好了. 4.打开cmd命令行窗口,直接输入python,如下图就表示解释器启动成功 5.提示符中输入以下语句,按回车键查看运行效果: 6.也可以通过命令执行

Python之路【第一篇】:Python基础

本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式for 循环 break and continue 表达式while 循环 作业需求 一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语

Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 注意点: self ,我们讲过了,self = 对象,实例化后的对象调用类的各种成员的时候的self就是这个对象. 而且我们也讲过了

用 Python 编写的 Python 解释器

Allison是Dropbox的工程师,在那里她维护着世界上最大的由Python客户组成的网络.在Dropbox之前,她是Recurse Center的引导师, - 她在北美的PyCon做过关于Python内部机制的演讲,并且她喜欢奇怪的bugs.她的博客地址是akaptur.com. Introduction Byterun是一个用Python实现的Python解释器.随着我在Byterun上的工作,我惊讶并很高兴地的发现,这个Python解释器的基础结构可以满足500行的限制.在这一章我们会

python函数默认参数为可变对象的理解

1.代码在执行的过程中,遇到函数定义,初始化函数生成存储函数名,默认参数初识值,函数地址的函数对象. 2.代码执行不在初始化函数,而是直接执行函数体. 代码实例 这要从函数的特性说起,在 Python 中,函数是第一类对象(function is the first class object),换而言之,函数也是对象,跟整数.字符串一样可以赋值给变量.当做参数传递.还可以作为返回值.函数也有自己的属性,比如函数的名字.函数的默认参数列表. # 函数的名字 >>> func.__name_

Python 基础入门 6_1 类与对象

# 类:一种数据类型,本身并不占内存空间,跟所学过的number等类型,一个类由属性(变量)和方法(函数)组成# 对象: 要使用类内部的属性和方法,就需要实例化类,这种实例化类就叫做对象 """定义类类名:首字母大写,其他遵循驼峰原则属性:其他遵循驼峰原则行为(方法/功能):其他遵循驼峰原则 创建一个类,格式如下:class 类名(): 定义属性(定义变量) 定义方法(定义函数)#在类中定义方法(函数)时,第一个参数名为self,表示对象名 构造函数:__init__(sel