为什么base64.b64encode()返回一个字节对象?

时间:2017-03-13 21:04:01

标签: python python-3.x unicode encoding base64

base64.b64encode()的目的是将二进制数据转换为ASCII安全"文本"。但是,该方法返回一个bytes类型的对象:

>>> import base64
>>> base64.b64encode(b'abc')
b'YWJj'

简单地接受输出和decode()它很容易,但我的问题是:base64.b64encode()返回bytes而不是str的重要性是什么? }?

2 个答案:

答案 0 :(得分:16)

  

base64.b64encode()函数的目的是将二进制数据转换为ASCII安全的“文本”

Python不同意这一点 - base64被故意归类为binary transform

Python 3中的设计决定强制分离字节和文本并禁止隐式转换。 Python现在非常严格,bytes.encode甚至不存在,因此b'abc'.encode('base64')会引发AttributeError

语言采用的意见是字节串对象已经编码。将字节编码为文本的编解码器不适合此范例,因为当您想要从字节域转到文本域时,它是 decode 。请注意,出于同样的原因,rot13编码也从standard encodings列表中消失了 - 它不适合Python 3范例。

还可以有一个性能参数:假设Python自动处理base64输出的解码,这是由binascii模块的C代码生成的 ASCII编码的二进制表示 ,进入文本域中的Python对象。如果你真的想要字节,你只需要通过再次编码为ASCII来撤销解码。这将是一次浪费的往返,一次不必要的双重否定。最好“选择加入”解码到文本的步骤。

答案 1 :(得分:13)

b64encode()无法知道您想要对其输出做什么。

虽然在许多情况下您可能希望将编码值视为文本,但在许多其他情况下 - 例如,通过网络发送 - 您可能希望将其视为字节。

由于b64encode()无法知道,因此拒绝猜测。由于输入为bytes,因此输出保持相同的类型,而不是隐式强制转换为str

正如您所指出的,将输出解码为str非常简单:

base64.b64encode(b'abc').decode('ascii')

......以及明确的结果。

顺便说一句,值得注意的是,尽管base64.b64decode()(注意: de 代码,而不是 en 代码)自版本3.3开始接受str,更改为somewhat controversial