一尘不染

在Python 3中将字符串转换为字节的最佳方法?

python

从TypeError的答案中可以看出,有两种不同的方式可以将字符串转换为字节:’str’不支持缓冲区接口

以下哪种方法更好或更Pythonic?还是仅仅是个人喜好问题?

b = bytes(mystring, 'utf-8')

b = mystring.encode('utf-8')

阅读 465

收藏
2020-02-12

共1个答案

一尘不染

如果你查看的文档bytes,它将指向bytearray

bytearray([源[,编码[,错误]]]

返回一个新的字节数组。bytearray类型是一个可变的整数序列,范围为0 <= x <256。它具有可变序列类型中介绍的大多数可变序列的常用方法,以及字节类型具有的大多数方法,请参见Bytes和字节数组方法。

可选的source参数可以通过几种不同的方式用于初始化数组:

如果是字符串,则还必须提供编码(以及可选的错误)参数;然后,bytearray()使用str.encode()将字符串转换为字节。

如果它是整数,则数组将具有该大小,并将使用空字节初始化。

如果它是符合缓冲区接口的对象,则该对象的只读缓冲区将用于初始化bytes数组。

如果是可迭代的,则它必须是0 <= x <256范围内的整数的可迭代对象,这些整数用作数组的初始内容。

没有参数,将创建大小为0的数组。

因此,bytes除了编码字符串以外,还可以做更多的事情。这是Pythonic的用法,它允许你使用有意义的任何类型的源参数来调用构造函数。

对于字符串编码,我认为它some_string.encode(encoding)比使用构造函数更具有Pythonic风格,因为它是最易于记录的文档-“使用此字符串并以这种编码方式对其进行编码”比bytes(some_string, encoding)- 更加清晰明了-当你使用构造函数。

编辑:我检查了Python源。如果将unicode字符串传递给bytes使用CPython,它将调用PyUnicode_AsEncodedString,它是encode; 的实现。因此,如果你自称,则只是跳过了一个间接级别encode。

另外,请参见Serdalis的评论- unicode_string.encode(encoding)也是Python 风格的,因为它的反函数是byte_string.decode(encoding),对称性很好。

2020-02-12