你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
在 Python 中对协议使用 PEAK(二)
 
在具有静态类型声明的编程语言中,为了在新的上下文中使用数据,您通常需要将其自一个类型 强制类型转换(cast)或者 转换(convert)到另一个类型。在其他语言中,转换根据上下文的需要隐式地进行,这些被称为 强迫同型(coercions)。Python 中既有强制类型转换也有强迫同型,通常使用更多的是前者(“显式优于隐式”)。您可以将向一个浮点数加到一个整型数,结果得到一个更为通用的浮点数;但是如果您希望将字符串 "3.14" 转换为一个数字,那么您需要使用显式的构造函数 float("3.14") 。

  PyProtocols 具有一个称为“适配(adaptation)”的功能,类似于“部分类型(partial typing)”这一非正统计算机科学概念。适配还可能被认为是“加速的强制同型”。如果一个接口定义了所需要的一组能力 (也就是对象方法),那么要去做“所需要的一切”的对象就要求适配 -- 通过 protocols.adapt() 函数实现 -- 以提供所需要的能力。显然,如果您有一个显式的转换函数可以将类型 X 的对象转换为类型 Y 的对象(在这里 Y 实现了某个 IY 接口),那么那个函数要能够让 X 适配协议 IY 。不过,PyProtocols 中的适配可以做比这多得多的事情。例如,甚至如果您从来没有显式地编写过从类型 X 到类型 Y 的转换程序, adapt() 通常可以推演出一条让 X 提供 IY 所要求的能力的途径(也就是说,找到从 X 到接口 IZ ,从 IZ 到 IW ,然后再从 IW 到 IY 的中间转换)。

  声明接口和适配器

  在 PyProtocols 中有很多不同的方法可以创建接口和适配器。PyProtocols 文档非常详细地介绍了这些技术 -- 很多不会在本文中涉及。接下来我们将进入一些细节,不过,我觉得,在这里给出实际的 PyProtocols 代码的一个最简化实例是个有用的方法。

  例如,我决定创建一个 Python 对象的类-Lisp 序列化。其描述并不是准确的 Lisp 语法,我也并不在意这种格式确切的优点和缺点。在这里,我的想法只是创建一个功能,使之可以执行类似 repr() 函数或 pprint 模块的工作,不过结果是既与以前串行器(serializers)有明显的不同,又要能更容易地扩展/定制。出于举例说明的目的做出了一个非常不像 Lisp 的选择:映射(mappings)是一个比列表(list)更为基础的数据结构(Python 的元组(tuple)或列表被作为以连续整数为键的映射来处理)。下面是代码:

  lispy.py PyProtocol 定义

(编辑:aniston)

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089