从TypeError的答案中可以看出,有两种不同的方式可以将字符串转换为字节:’str’不支持缓冲区接口
以下哪种方法更好或更Pythonic?还是仅仅是个人喜好问题?
b = bytes(mystring, 'utf-8') b = mystring.encode('utf-8')
如果你查看的文档bytes,它将指向bytearray:
bytes
bytearray
bytearray([源[,编码[,错误]]])
[
]]]
返回一个新的字节数组。bytearray类型是一个可变的整数序列,范围为0 <= x <256。它具有可变序列类型中介绍的大多数可变序列的常用方法,以及字节类型具有的大多数方法,请参见Bytes和字节数组方法。
0 <= x <256
可选的source参数可以通过几种不同的方式用于初始化数组:
source
如果是字符串,则还必须提供编码(以及可选的错误)参数;然后,bytearray()使用str.encode()将字符串转换为字节。
bytearray()
str.encode()
如果它是整数,则数组将具有该大小,并将使用空字节初始化。
如果它是符合缓冲区接口的对象,则该对象的只读缓冲区将用于初始化bytes数组。
如果是可迭代的,则它必须是0 <= x <256范围内的整数的可迭代对象,这些整数用作数组的初始内容。
没有参数,将创建大小为0的数组。
因此,bytes除了编码字符串以外,还可以做更多的事情。这是Pythonic的用法,它允许你使用有意义的任何类型的源参数来调用构造函数。
Pythonic
对于字符串编码,我认为它some_string.encode(encoding)比使用构造函数更具有Pythonic风格,因为它是最易于记录的文档-“使用此字符串并以这种编码方式对其进行编码”比bytes(some_string, encoding)- 更加清晰明了-当你使用构造函数。
some_string.encode(encoding)
bytes(some_string, encoding)
编辑:我检查了Python源。如果将unicode字符串传递给bytes使用CPython,它将调用PyUnicode_AsEncodedString,它是encode; 的实现。因此,如果你自称,则只是跳过了一个间接级别encode。
PyUnicode_AsEncodedString
另外,请参见Serdalis的评论- unicode_string.encode(encoding)也是Python 风格的,因为它的反函数是byte_string.decode(encoding),对称性很好。
Serdalis
unicode_string.encode(encoding)
byte_string.decode(encoding)