online not convertir codificar codecs bytes arbitrary python python-3.x unicode encoding base64

not - convertir a base64 python



¿Por qué base64.b64encode() devuelve un objeto de bytes? (2)

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() devuelve bytes lugar de una str ?


El propósito de la función base64.b64encode () es convertir datos binarios en "texto" ASCII-safe

Python no está de acuerdo con eso: la 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 respecto a 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 prueba ya está codificado. Un códec que codifica bytes en texto no se ajusta a este paradigma, porque cuando se quiere pasar del dominio de bytes al dominio de texto, se trata de una decodificación . Tenga en cuenta que la codificación rot13 también se rot13 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: supongamos 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 Python en el dominio de texto. Si realmente deseaba los bytes, solo tendría que deshacer la decodificación codificando en ASCII nuevamente. Sería un viaje redondo inútil, una doble negación innecesaria. Mejor ''opt-in'' para el paso de decodificación a texto.


Es imposible que b64encode() sepa qué 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, enviarlo a través de una red, es posible que desee tratarlo como bytes.

Como b64encode() no puede saber, se niega a adivinar. Y dado que la entrada es bytes , la salida sigue siendo del mismo tipo, en lugar de ser forzada implícitamente a str .

Como usted señala, descodificar la salida a str es sencillo:

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

... además de ser explícito sobre el resultado.

Como nota aparte, vale la pena señalar que aunque base64.b64decode() (nota: código, no código en ) ha aceptado str desde la versión 3.3, el cambio fue algo controvertido .