El propósito de base64.b64encode()
es convertir datos binarios en "texto" seguro para ASCII. Sin embargo, el método devuelve un objeto de tipo bytes:
>>> import base64 >>> base64.b64encode(b'abc') b'YWJj'
Es fácil simplemente tomar esa salida y decode()
, pero mi pregunta es: ¿cuál es el significado de base64.b64encode()
devuelva bytes
en lugar de una str
?
El propósito de la función base64.b64encode() es convertir datos binarios en "texto" seguro para ASCII
Python no está de acuerdo con eso: base64 se ha clasificado intencionalmente como una transformación binaria .
Fue una decisión de diseño en Python 3 forzar la separación de bytes y texto y prohibir las transformaciones implícitas. Python ahora es tan estricto con esto que bytes.encode
ni siquiera existe, por lo que b'abc'.encode('base64')
generaría un AttributeError
.
La opinión que toma el lenguaje es que un objeto de cadena de bytes ya está codificado. Un códec que codifica bytes en texto no encaja en este paradigma, porque cuando desea pasar del dominio de bytes al dominio de texto, es una decodificación . Tenga en cuenta que la codificación rot13
también se eliminó de la lista de codificaciones estándar por la misma razón: no encajaba correctamente en el paradigma de Python 3.
También puede haber un argumento de rendimiento para hacer: suponga que Python manejó automáticamente la decodificación de la salida base64, que es una representación binaria codificada en ASCII producida por el código C del módulo binascii
, en un objeto de Python en el dominio de texto. Si realmente quisiera los bytes, solo tendría que deshacer la decodificación codificando en ASCII nuevamente. Sería un viaje de ida y vuelta inútil, una doble negación innecesaria. Es mejor 'optar por participar' en el paso de decodificación a texto.
Es imposible que b64encode()
sepa lo que quiere hacer con su salida.
Si bien en muchos casos es posible que desee tratar el valor codificado como texto, en muchos otros, por ejemplo, al enviarlo a través de una red, es posible que desee tratarlo como bytes.
Dado que b64encode()
no puede saberlo, se niega a adivinar. Y dado que la entrada es bytes
, la salida sigue siendo del mismo tipo, en lugar de forzarse implícitamente a str
.
Como señala, decodificar la salida a str
es sencillo:
base64.b64encode(b'abc').decode('ascii')
... además de ser explícito sobre el resultado.
Aparte, vale la pena señalar que aunque base64.b64decode()
(nota: de code, no en code) ha aceptado str
desde la versión 3.3, el cambio fue algo controvertido .