python 庫簡介

2
62 程序员 特别策划 Features “俗话”说:库即是语 言,语言即是库。由此可见拥有一套 高质量、具备良好可复用库对于一 门通用开发语言来说有多重要。这 也的难怪“C + +老爹”B j a r n e Stroustrup 逢人就大倒苦水:C++ 的库 还是太少,C++ 社群需要开发更多高 质量的库出来! 还好,为Python 语言开发一套质 量不错的库的复杂程度远没有 C++ 来得复杂。而且Python 社区同样也深 知库的重要性。结果就是Python 的发 行版即奉上超过300 个的标准库(这 还不包括专门针对 Mac 机的50余个 库,谁让那小子另类呢)。 300 多个库中,绝大部分具备跨 平台能力(*NIX/Windows )。这些库 覆盖了开发的方方面面,Python 语言 的用户可以在一个典型命令行环境 下(比如Linux Shell ),仅仅利用标准 库即可完成绝大部分工作,同时无 需考虑库的各种兼容性问题。Python 社群对于库的重视可见一斑。 即便是拥有如此多的标准库。 这也似乎未能阻止Python 社群的开发 者们天马行空般的思维。借助于动 态语言简洁、优雅、灵活的表达能 力,这些第三方的库经常展现出令 人赞叹的想象力。 好吧,现在让我们在庞大的Py- thon 库选取点滴,也许它能带给我们 一些另类的思考。 SQLObject SQLObject 可以看做是 Python 域的 Hibernate 。它也是目前 python 区中最为成熟方便的O/R mapping 具。和Hibernate 相比,SQLObject 利用 了动态语言的独有特性,通过灵活使 用继承、灵活使用 MetaData 能力,能 够快速方便定义直接在程序中定义 映射类,不用像 Hibernate 中那样还需 单独定义一个XML 文件。同样,借助 强大的动态能力,SQLObject 还拥有 一个Hibernate 所远不及的功能,那就 是 SQLObject 的映射类可以在运行时 动态改变自身结构,这也意味着数 据库中的表结构也可以在运行时进 行改变。总之,对Hibernate 略有了解 的开发者均能迅速理解 SQLObject 虽然我一直认为 SQLObject 还远 未能将Python 的动态能力发挥到极 致。不过这却是一个良好的开始。也 许我们可以在不久将来看到更多更 具新意的 O/R mapping 工具。 TurboGear 自 RoR(Ruby on Rails) 在 Web 发领域一夜成名后,在其它语言社 区,跟风之作也如雨后春笋一般涌 现出来。虽然TurboGear 并非刻意模仿 RoR 之作,不过它确确实实借着 RoR 流行潮流得到更多人的重视。 与 RoR 相同,TurboGear 也是一个 轻量级Web 开发套件,通过几个命令 行工具能够快速生成以数据库为核 心的基本框架代码。典型的 R o R 想!这和许多开源框架的原则一样 ——“避免重新发明轮子”。TurboGear 的 Web 控制层使用 CherryPy; 持久层 使用 SQLObject; 模板使用 Kid;AJAX 使用 MochiKit 。几乎所有的重要的功 能组件都源自第三方。TurboGear 自身 更像一个黏合剂,把所有的功能组 合在一起,并能够形成力量的倍增。 4Suite 虽然Python 标准库提供了 XML 处理工具,但是它只提供一些基本 功能。如果你想获得更为强大的XML 处理能力,4Suite 是一个更好的选择。 4Suite 被称为XML 工具中“内行 的选择”。除了最基本的Dom-Like SAX-Like 处理库外,4Suite 还提供 Python 库简介 □ 文 /汤韬

Upload: chui-wen-chiu

Post on 19-May-2015

759 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Python 庫簡介

62 程序员

特别策划 Features

“俗话”说:库即是语

言,语言即是库。由此可见拥有一套

高质量、具备良好可复用库对于一

门通用开发语言来说有多重要。这

也的难怪“C + + 老爹”B j a r n e

Stroustrup逢人就大倒苦水:C++的库

还是太少,C++社群需要开发更多高

质量的库出来!

还好,为Python语言开发一套质

量不错的库的复杂程度远没有C++

来得复杂。而且Python社区同样也深

知库的重要性。结果就是Python的发

行版即奉上超过300个的标准库(这

还不包括专门针对Mac机的50 余个

库,谁让那小子另类呢)。

300多个库中,绝大部分具备跨

平台能力(*NIX/Windows)。这些库

覆盖了开发的方方面面,Python语言

的用户可以在一个典型命令行环境

下(比如Linux Shell),仅仅利用标准

库即可完成绝大部分工作,同时无

需考虑库的各种兼容性问题。Python

社群对于库的重视可见一斑。

即便是拥有如此多的标准库。

这也似乎未能阻止Python社群的开发

者们天马行空般的思维。借助于动

态语言简洁、优雅、灵活的表达能

力,这些第三方的库经常展现出令

人赞叹的想象力。

好吧,现在让我们在庞大的Py-

thon库选取点滴,也许它能带给我们

一些另类的思考。

SQLObjectSQLObject 可以看做是Python领

域的Hibernate。它也是目前python社

区中最为成熟方便的O/R mapping工

具。和Hibernate相比,SQLObject利用

了动态语言的独有特性,通过灵活使

用继承、灵活使用MetaData能力,能

够快速方便定义直接在程序中定义

映射类,不用像Hibernate中那样还需

单独定义一个XML文件。同样,借助

强大的动态能力,SQLObject 还拥有

一个Hibernate所远不及的功能,那就

是SQLObject的映射类可以在运行时

动态改变自身结构,这也意味着数

据库中的表结构也可以在运行时进

行改变。总之,对Hibernate略有了解

的开发者均能迅速理解SQLObject。

虽然我一直认为SQLObject还远

未能将Python的动态能力发挥到极

致。不过这却是一个良好的开始。也

许我们可以在不久将来看到更多更

具新意的O/R mapping 工具。

TurboGear自RoR(Ruby on Rails)在Web开

发领域一夜成名后,在其它语言社

区,跟风之作也如雨后春笋一般涌

现出来。虽然TurboGear并非刻意模仿

RoR之作,不过它确确实实借着RoR

流行潮流得到更多人的重视。

与RoR相同,TurboGear也是一个

轻量级Web开发套件,通过几个命令

行工具能够快速生成以数据库为核

心的基本框架代码。典型的RoR思

想!这和许多开源框架的原则一样

——“避免重新发明轮子”。TurboGear

的Web控制层使用CherryPy;持久层

使用SQLObject;模板使用Kid;AJAX

使用MochiKit。几乎所有的重要的功

能组件都源自第三方。TurboGear自身

更像一个黏合剂,把所有的功能组

合在一起,并能够形成力量的倍增。

4Suite虽然Python标准库提供了XML

处理工具,但是它只提供一些基本

功能。如果你想获得更为强大的XML

处理能力,4Suite是一个更好的选择。

4Suite被称为XML工具中“内行

的选择”。除了最基本的Dom-Like和

SAX-Like处理库外,4Suite还提供

Python库简介□ 文/汤韬

Page 2: Python 庫簡介

Programmer 63

>>> 程序员开源手册

XInclude,XPointer,XLink,XPath,

XUpdate用于XML文档的查询、更新

操作等等;提供XSLT完整处理能力。

4Suite不光功能强大,性能也相

当不错。这主要是得益于其核心代

码部分采用C完成。这在需要处理大

量XML文档的地方,4Suite实在是一

个完美的选择。

PyroPyro的全称是“Python Remote

Objects”。按照字面即可理解Pyro的

功能:提供远程对象。Pyro 为Python

语言提供异常简洁的RPC解决方案。

其实Python语言中不乏一些更

加通用的远程调用方案,例如都是

基于XML的XMLRPC和SOAP。那么

Pyro这样的单纯的Python远程调用方

案具有什么样的优势呢?那就是性

能与易用性。

由于动态语言具有强大反射能

力,因此实现对象序列化对于Python

来说简直易如反掌。对象的序列化

在Python中被称为pickle,这是许多

Python应用的核心机制。Pyro也正是

充分利用pickle的威力,在网络间提

供远程对象的调用。它的性能要远

远超过使用XML 对远程对象进行编

码/解码。同时,它在接口调用设计

上也非常简洁。在服务器端和客户

端只需2、3行代码就完成对象的封

装与调用,远比SOAP来得简单轻松。

Twisted上个月,Zope 3.2发布,在这个最

新版中,一个重要的变化就是:使用

了近十年的处理Web请求的网络框架

代码被放弃,取而代之是以Twisted为

核心实现的代码。据称这样可以改善

系统性能以及可扩展性。于是Twisted

库再一次成为了人们关注的焦点。

Twisted的核心概念是非阻塞异

步网络服务器(所以它也被成为Py-

thon中ACE,如果你还不知道什么是

ACE,那么看看前面关于C++库的文

章),这是目前为止性能最好的网络

处理模型。也许是非阻塞异步处理

的天生复杂性所致,Twisted几乎是

我所见过的最复杂,最难用的Python

库。Twisted的使用者需要面对大量

新的概念和新的模式,这一点上和

ACE倒颇有几分相似。

陡峭的学习曲线,阻碍了很多

人掌握Twisted库。这也许是想要获

得高性能所付出的必要代价。难怪

O’REYLLI在其出版的关于Twisted的

书的封面引用了一只九头怪蛇,还

真是贴切。

Psyco赞美Python的好话可以说一箩筐,

那么它的缺点是什么?这还用问吗,当

然是性能。性能——已经成为Python根

深蒂固的老毛病了。不要说和C++/

Java/C#这样的语言相比,即使是和它

的同门兄弟们——Ruby、Perl、PHP这

样的脚本语言相比,Python的性能依然

是最糟糕的。Python的设计者们似乎仅

仅在乎语言机制的完美,几乎不考虑性

能。CPythony 引擎已经发展了这么多

年,查看其源代码,性能优化代码少之

又少。对象引用模型至今还在使用引

用计数器的方式,至于发展一个JIT引

擎,算了吧,不要指望了。

还好,Psyco 的出现,带给我们

了一线希望。Psyco通过将运行中字

节码编译为二进制代码从而大幅提

升整个应用的性能,在某些环境中

甚至能将速度提升一个数量级。

虽然Psyco还不能视为一个真正

意义上的JIT的引擎,也无法像Java

中的JIT 那样提供完全透明的服务。

但我们仍然要为Psyco的发展感到振

奋。目前,在其最新版本中,只需两

行代码的添加,就能使你的程序充

分使用Psyco,从而提升性能。

wxPython在许多人眼里,动态语言/脚本

语言一般仅适合完成命令行或WEB

的工作,而在桌面开发方面实在是

丑陋不堪。而wxPython的出现无疑

是给这种偏见以有力的回击。

wxPy t h o n 实际上发展多年的

C++框架wxWindow(现已更名为

wxWidge t s)的Py t h o n封装。而

wxWindow的目标是建立一个跨平台

的GUI 框架。wxWindow现已能在

Windows/Unix/Mac上良好运行。自

然wxPython也能横跨上述几个平台。

wxPython使用的原生窗口。这就

意味着使用wxPython开发的GUI和操

作系统本地GUI系统在界面外观上没

有任何区别。如果和Java中GUI库对比

一下,就可以发现,wxPython更加类

似SWT而不是Swing。因为SWT也是

使用的原生窗口,想想Eclipse的界面

有多漂亮就知道原生窗口的优势了。

虽然不少C++爱好者对wxWindow

框架的设计颇有微词,不过在经过

Python的封装后,没有了指针、没有了

MFC时代的事件机制,wx框架的易用

性获得了极大提升。这也是Python的另

一个巨大魅力所在。

汤韬,OSDN(www.osdn.net.

cn)网站开发主管,对 Linux以及

开源技术拥有广泛兴趣,喜好

Python、Ruby 等动态语言。

作者介绍: