繁体   English   中英

支持python 2和3:str,bytes或alternative

[英]Supporting python 2 and 3: str, bytes or alternative

我有一个Python2代码库,它广泛使用str来存储原始二进制数据。 我想支持Python2和Python3。

Python2中的bytesstr的alis)类型和Python3中的bytes完全不同。 它们采用不同的参数来构造,索引到不同的类型并具有不同的strrepr

统一两个Python版本的代码的最佳方法是什么,使用单一类型来存储原始数据?

python-future封装具有反向移植的Python3字节类型。

>>> from builtins import bytes  # in py2, this picks up the backport
>>> b = bytes(b'ABCD')

这提供了Python 3接口两者的Python 2和Python 3.在Python 3,它是内置的bytes类型。 在Python 2中,它是str类型之上的兼容层。

我不知道你想用字节处理哪些部分,我几乎都在使用bytearray,这就是我从文件中读取时的方法

with open(file, 'rb') as imageFile:
    f = imageFile.read()
    b = bytearray(f)

我把它从我正在进行的项目中拿出来,它在2和3都有效。也许你可以看一下吗?

如果您的项目小而简单,请使用六个

否则我建议有两个独立的代码库:一个用于Python 2,一个用于Python 3.最初它可能听起来像很多不必要的工作,但最终它实际上更容易维护。

作为一个例子,如果您决定在单个代码库中支持两个蟒蛇,您的项目可能会成为什么,请查看谷歌的protobuf 代码周围经常有违反直觉的分支,为了允许破解而修改的抽象。 随着您的项目不断发展,它将不会变得更好:截止日期与代码的质量相悖。

使用两个单独的代码库,您只需应用几乎相同的补丁,如果您需要单个代码库,那么与您之前的工作相比并不是很多。 一旦包的Python 2用户数量下降,将更容易迁移到Python 3。

假设您只需要支持Python 2.6及更高版本,您可以简单地将bytes用于字节。 使用b文字创建字节对象,例如b'\\x0a\\x0b\\x00' 使用文件时,请确保模式包含b (如open('file.bin', 'rb') )。
请注意,迭代和元素访问是不同的。 在这些情况下,您可以编写代码以使用块。 而不是b[0] == 0 (Python 3)或b[0] == b'\\x00' (Python 2)写b[0:1] == b'\\x00' 其他选项是使用bytearray (当字节是可变的时)或辅助函数。

字符串应该是Python 2中的unicode ,独立于Python 3移植; 否则,遇到非ASCII字符时代码可能会出错。 相当于Python 3中的str
使用u文字创建字符串(例如u'Düsseldorf' )和/或确保使用from __future__ import unicode_literals启动每个文件。 必要时通过# encoding: utf-8启动文件来声明文件编码。
使用io.open从文件中读取字符串。 对于网络代码,获取字节并decode进行调用decode以获取字符串。

如果您需要支持Python 2.5或3.2,请查看六个转换文字。

添加大量断言以确保对字符串进行操作的函数不会获取字节,反之亦然。 像往常一样,100%覆盖率的良好测试套件有很大帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM