PEAK是一个用于快速开发和重用应用程序组件的 Python 框架。虽然 Python 本身就已经是一门非常高层次的语言,但 PEAK 提供了更高层次的抽象,这些抽象主要来自于对元类(metaclass)及其他高级Python 技术的巧妙运用。在很多方面,PEAK 对 Python 的贡献相当于 J2EE 对 Java 的贡献。PEAK 中的形式化部分体现在协议的显式规范中,具体说是在可以单独获得的 PyProtocols 包中。
如果您正尝试去处理元类,或者正受困于 Twisted 中的异步编程,或者正在研究由于使用了多分派而使您精疲力尽的面向对象编程,那么您完全错了!PEAK 将所有这些中的一些要素组合到了一个组件编程框架中。PEAK 还存在一些小问题。类似于 Twisted,PEAK 的文档 -- 尽量数量巨大 -- 难以看懂。但是尽管如此,关于 Python 领袖 Phillip J. Eby 领导的这一项目还是有一些东西非常值得关注;而且,我觉得,有机会进行极具生产价值的并且层次特别高的应用程序开发。
PEAK 包由许多不同用途的子包组成。一些重要的子包是 peak.api、 peak.binding、 peak.config、 peak.naming 和 peak.storage 。那些名字大部分是自我解释性的。子包 peak.binding 用于组件间的灵活连接; peak.config 让您可以存储“很少改变的(lazily immutable)”数据,这些数据与声明性应用程序(declarative application )编程有关; peak.naming 让您可以为(网络的)资源创建全局惟一的标识符; peak.storage 顾名思义让您可以管理数据库和持久内容。
不过,对本文来说,我们将关注的是 peak.api 。特别是 PyProtocols 包,它可以单独获得并为其他 PEAK 子包提供一个基础设施。在 peak.api.protocols 中包括了 PyProtocols 包的一个版本。不过现在我所感兴趣的是研究一个独立的 protocols 包。在以后的部分,我将返回来讨论 PEAK 其他部分的话题。
什么是协议?
抽象地说,协议只是对象同意遵循的一组行为。强类型(Strongly-typed)编程语言 -- 包括 Python -- 都有一个基本类型的集合,每个基本类型都有一组得到保证的行为:Integer 知道如何去求它们自己的乘积;list 知道如何去遍历它们的内容;dictionary 知道如何根据一个关键字找到相应的值;file 知道如何去读和写字节;诸如此类。您可以预期的内置类型的行为集合构成了它们实现的一个 协议。对协议进行系统化的对象被称为 接口(interface)。
对标准的类型而言,将实现的所有行为全部列出并不太困难(尽管不同的 Python 版本之间会稍有不同;或者,不同的编程语言之间当然会有差别)。但是,在边界 -- 对于属于自定义类的对象来说 -- 难以声明最终是什么构成了“类-dictionary”或“类-file”的行为。大部分情况下,只实现了比如内置的 dict 类型的方法的一个子集 -- 甚至是相当小的子集 -- 的自定义对象,就足够“类-dictionary”而可以满足当前的要求。不过,能显式地整理出一个对象要用到的函数、模块、类或者框架中需要能够做哪些事情,将是很吸引人的。那就是 PyProtocols 包所做到的(一部分)。
|