Saltar al contenido

¿La mejor manera de convertir cadenas a bytes en Python 3?

septiembre 25, 2021
apple touch icon@2

Si miras los documentos para bytes, te apunta a bytearray:

bytearray[source[, encoding[, errors]]])

Devuelve una nueva matriz de bytes. El tipo bytearray es una secuencia mutable de enteros en el rango 0 <= x <256. Tiene la mayoría de los métodos habituales de secuencias mutables, descritos en Tipos de secuencia mutable, así como la mayoría de los métodos que tiene el tipo de bytes, consulte Bytes y Métodos de matriz de bytes.

El parámetro de fuente opcional se puede utilizar para inicializar la matriz de diferentes formas:

Si es una cadena, también debe proporcionar los parámetros de codificación (y opcionalmente, errores); bytearray () luego convierte la cadena en bytes usando str.encode ().

Si es un número entero, la matriz tendrá ese tamaño y se inicializará con bytes nulos.

Si es un objeto que se ajusta a la interfaz de búfer, se utilizará un búfer de solo lectura del objeto para inicializar la matriz de bytes.

Si es un iterable, debe ser un iterable de enteros en el rango 0 <= x <256, que se utilizan como el contenido inicial de la matriz.

Sin un argumento, se crea una matriz de tamaño 0.

Entonces bytes puede hacer mucho más que codificar una cadena. Es Pythonic que le permitiría llamar al constructor con cualquier tipo de parámetro fuente que tenga sentido.

Para codificar una cadena, creo que some_string.encode(encoding) es más Pythonic que usar el constructor, porque es lo más autodocumentado: «tome esta cadena y codifíquela con esta codificación» es más claro que bytes(some_string, encoding) – no hay un verbo explícito cuando usas el constructor.

Editar: Revisé la fuente de Python. Si pasa una cadena Unicode a bytes usando CPython, llama PyUnicode_AsEncodedString, que es la implementación de encode; por lo que se está saltando un nivel de indirección si llama encode tú mismo.

Además, vea el comentario de Serdalis: unicode_string.encode(encoding) también es más pitónico porque su inverso es byte_string.decode(encoding) y la simetría es agradable.

close