[英]Supporting python 2 and 3: str, bytes or alternative
我有一个Python2代码库,它广泛使用str
来存储原始二进制数据。 我想支持Python2和Python3。
Python2中的bytes
( str
的alis)类型和Python3中的bytes
完全不同。 它们采用不同的参数来构造,索引到不同的类型并具有不同的str
和repr
。
统一两个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.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.