自动解码字节的最佳方法

时间:2014-02-01 02:13:48

标签: python python-3.x

目前我正在使用以下内容(适用于Py2和3)

if isinstance(string, bytes):
    string = string.decode('utf-8')

但是,有没有更好的方法来兼容Python 2和3。好像我错过了一些明显的东西。在python 2中,它就像str(string)

一样简单

编辑:

上下文:我正在使一个库/ util类接受一个Redis客户端对象。此对象具有自动解码响应(默认关闭)或返回普通字节的选项。因此,给定来自此对象的响应,它可以是字节或str,具体取决于对象的配置方式

1 个答案:

答案 0 :(得分:2)

最好的方法是首先避免这个问题。使用"unicode sandwich" technique - 在读取数据后快速将数据转换为字符串,并仅在需要序列化时将其转换回字节。如果你这样做,那么你不应该得到一个可能是字符串或可能是字节的对象,所以你不应该检测它是否已被解码。


如果真的由于某种原因无法做到这一点(如果某些第三方代码可能会根据您无法控制的情况向您提供),那么下一个最简单的方法就是使用库six,它可以更容易地编写适用于Python 2和Python 3的代码。除此之外,它还有一个名为six.binary_type的变量,在Python 3中是bytes和Python 2中的str使您可以将现有技术修改为:

if isinstance(string, six.binary_type):
    string = string.decode('utf-8')

请注意,在Python 2中,str(string)使为您提供相同类型的对象 - 它会为您提供str,其填充与Python 3相同的角色bytes。您实际上需要unicode(string, 'utf-8'),但您也可以使用decode,因为它们在两者中都具有相同的名称。