下面文章主要介绍下Python 源代码的编制和一些常规技巧,这些内容都是一些门户网站和技术论坛找到的,中间可能有不少错误是我没有挑出的,欢迎大家指正,希望大家学习探讨。
人电脑开始出现.个人电脑带了形形色色的软件包,用来处理文件.其中有电子表格文件、字处理文件。图形编辑器文件.ABC 的用户希望能用 ABC 写个小程序,从他们的字处理文件读出一些数据,然后把数据写到电子表格里,或者反过来,但是他们望洋兴叹,只能怪 IO 的无能.
Bill Venners: 他们想处理文件,Guido van Rossum: 他们想处理的是数据,但是数据却呆在文件里面.而 ABC 里没有文件的概念,这让事情复杂化了。Python 中的可扩展性Guido van Rossum: 让 ABC 里的缺位的文件支持雪上加霜的是,要扩展 ABC 语言并非易事.如果你这样想:“这个语言是用 C 实现的。
所以我们在它的标准库里面加个读文件的函数难道不就行了?”,那就大错特错了.ABC 是没有标准函数库一说的.它有的是内置命令。但是管这些命令的是 parser.ABC 也有内置函数,但是这些函数和运行时绑在了一起.要为这个语言的标准功能添砖加瓦简直是难如登天。
对 Python 源代码来说,我认识到,可扩展性是显而易见的重中之重.我之前就了解到 Python 需要在多种平台上运行.即,我知道我们要求 Python 在我们正在开发的 Amoeba 上,以及 UNIX 上运行。后者是我们作为桌面的操作系统.同时,我也想到了,我们也会需要他支持 Windows 和 Macintosh.我想到,这些系统上有些功能是共有的。
比如标准 IO 库,但是还有些功能是不互通的.如果要在 Windows 的屏幕上画些东西,你写的代码肯定和 Macintosh 和 Unix 上不一样,而且编程的模式也会大相径庭.后来,我为 Python 构思了一个具有相当灵活性的可扩展模型.我提出:“我们将会为这门语言提供一系列的内置对象类型。
比如 dictionary, 列表,各种数字类型,以及字符串.而且,我们也会让第三方程序员能轻而易举地在系统中加入他们自己的对象类型.”由于 ABC 是作为一种规模相对较小的语言设计的,所以它也不支持名字空间 (namespace).它只有函数和过程.你没有办法把函数和过程分组。
后来,虽然他们加入了一个名字空间的机制,但是我觉得那套机制太简陋粗糙了.那时,我已经有了一些 Modula-2 和 Modula-3 的相关经验,因此我决定把模块 (module) 作为 Python 的主要编程单位之一.我决定让 Python 有两种不同的模块:你可以用 Python 编写模块,但是也可以完全用 C 语言为 Python 编写模块.并且 C 语言写的模块可以实现新的数据类型。
提供新的对象.这个想法后被被证明是先见之明,因为我在 CWI 的同事,用户,还有我自己都开始编写我们自己用的扩展模块.这些扩展模块让你能想干什么就干什么:调用图形库、数据流库,还能操作各种数据格式。
Bill Venners: 如此说来,如果我用 C 语言写了个模块,那么我就能在自己的 Python 程序里面用上它,而且模块中的数据类型就像 Python 亲生的?Guido van Rossum: 一点没错.在 Python 源代码 里面,使用模块的方法就只有用 import 语句一途.Python 的 import 和 Java 的 import 有一点小小的不一样,不过它们背后的思想是共通的。
一旦你 import 了某个模块名,系统就会用几种不同的办法试图找到这个模块.我们会设置一个搜索路径,用来在里面搜索不同类型的文件.如果你在为 import foo 找文件,那么它会最后找出一个叫 foo.py 或者 foo.so (Windows 上叫 foo.dll) 的文件。#t#
foo.py 是一个 Python 的源文件.Python 源文件将来会被解析并解释执行.这个过程让函数/过程得以为程序所用.foo.so 或者 foo.dll 是编译好的机器码。这种动态链接库是用 C 或者 C++ 实现的,但也有人用 Fortran 编写自己的扩展,这些扩展将来会链接到一些大型的 Fortran 库上去。
从 Python 的角度来看,你使用事先编译好的机器码模块的方式和用 Python 源代码模块没什么区别.反正都是把它们 import 进来.你可以把模块的内容列出来,看看里面都有什么.或者,如果你对模块已经比较熟的话,就可以直接开始用它了。
Guido van Rossum: 一点没错.在 Python 里面,使用模块的方法就只有用 import 语句一途.Python 的 import 和 Java 的 import 有一点小小的不一样,不过它们背后的思想是共通的。一旦你 import 了某个模块名,系统就会用几种不同的办法试图找到这个模块.我们会设置一个搜索路径,用来在里面搜索不同类型的文件。
如果你在为 import foo 找文件,那么它会最后找出一个叫 foo.py 或者 foo.so (Windows 上叫 foo.dll) 的文件。foo.py 是一个 Python 的源文件.Python 源文件将来会被解析并解释执行.这个过程让函数/过程得以为程序所用.foo.so 或者 foo.dll 是编译好的机器码。
这种动态链接库是用 C 或者 C++ 实现的,但也有人用 Fortran 编写自己的扩展,这些扩展将来会链接到一些大型的 Fortran 库上去。从 Python 的角度来看,你使用事先编译好的机器码模块的方式和用 Python 源代码模块没什么区别.反正都是把它们 import 进来。你可以把模块的内容列出来,看看里面都有什么.或者,如果你对模块已经比较熟的话,就可以直接开始用它了.
【编辑推荐】