目前我正在使用以下内容(适用于Py2和3)
if isinstance(string, bytes):
string = string.decode('utf-8')
但是,有没有更好的方法来兼容Python 2和3。好像我错过了一些明显的东西。在python 2中,它就像str(string)
编辑:
上下文:我正在使一个库/ util类接受一个Redis客户端对象。此对象具有自动解码响应(默认关闭)或返回普通字节的选项。因此,给定来自此对象的响应,它可以是字节或str,具体取决于对象的配置方式
答案 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
,因为它们在两者中都具有相同的名称。