设为首页 收藏本站
查看: 1148|回复: 0

[经验分享] 为个小善——发布 Python 库 absolute32

[复制链接]

尚未签到

发表于 2017-5-5 09:43:16 | 显示全部楼层 |阅读模式
赖勇浩(http://laiyonghao.com)
问题1
在较新版本的 Python 中,当两个 int 相加溢出时,它会自动把把结果转换到 long 类型,比如:
>>> 0x7FFFFFFF + 12147483648L这个特性很好,但是它跟 C 语言的结果不一样。如果你要把结果 pack 到 4 个字节的 buffer 中发送到别的进程,结果就比较纠结:
>>> import struct>>> struct.pack("i", 0x7FFFFFFF + 1)Traceback (most recent call last):File "<stdin>", line 1, in <module>struct.error: long too large to convert to int我在设计我的 webgame 网络协议时遇到了这个问题。
问题2
在不同的硬件平台,同一个函数的返回值也可能是不一样的,比如 hash(),在 32-bit 和 64-bit 都是返回 int,但大小却大有不同:
>>> hash('copyright' * 10) # 32-bit platform-942199392>>> hash('copyright' * 10) # 64-bit platform-6555514777893392992想像一下你在 32-bit 下写了一个 k/v 存储的文件放到 64-bit 去读,或者反过来,是不是让你很抓狂?
问题3
在不同的 python 版本里,不少函数的返回值也是不一样的,举个例子,zlib 里的 crc32 函数,嗯,是的,别以为它以 32 结尾就一致了!以下引用自 python manuals:
Changed in version 2.6: The return value is in the range [-2**31, 2**31-1] regardless of platform. In older versions the value is signed on some platforms and unsigned on others.

Changed in version 3.0: The return value is unsigned and in the range [0, 2**32-1] regardless of platform.
看到了吧,zlib.crc32(及 zlib.adler32) 虽然跟 32/64 位平台无关,但是 3.x 和 2.x 版本的返回值范围是不一致的,想象一下你设计的网络协议采用了 crc/adler 算法来计算 checksum,然后用于 3.x 和 2.x 版本的 Python 程序通信,会不会想抓狂呢?
解决方案
解决方案显然是一致化,编写这些操蛋的函数的替代品,确保它们在不同的硬件、不同的版本下有同样的返回值。
所以我就编写了自己版本的 add、hash、crc 和 adler 函数,确保它们的返回值为带符号的 32 位整型(即值范围 [-2**31, 2**31-1])。经过在 ubuntu 10.04 LTS 32-bit/64-bit + python 2.6/3.1 测试后,我们把它用在了我们的网络协议处理中。
后来,我把它打成了一个 lib,起名为 absolute32,扔到 google code 托管起来(http://code.google.com/p/absolute32/),同时在 pypi 注册一下,方便有需要的朋友使用它,算是为个小善。
absolute32 安装、使用
安装很简单,因为它已经上传到 pypi,所以简单地执行:
easy_install -U absolute32就安装好啦,最后送上示例,享用吧,亲!
import absolute32 as aassert a.add(0x7FFFFFFF, 2) == -0x7FFFFFFFassert a.hash('copyright') == -174803930assert a.adler(b'copyright') == 322503642assert a.crc(b'copyright') == 947983859

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-373280-1-1.html 上篇帖子: 【转】 Python 程序员的进化--搞笑版 下篇帖子: UltraJSON——Python 的极速 JSON 编解码器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表