ProgramaciónDesarrollador Backend

Explique el funcionamiento y las características del tipo incorporado bytes en Python. ¿Cómo y dónde se utiliza, en qué se diferencia de str y qué matices son importantes al procesar datos binarios?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Historia del problema

Con la llegada de Python 3, el tipo bytes se convirtió en la principal forma de almacenar y procesar datos binarios, separándose de las cadenas (str). En Python 2, las cadenas (str) podían contener tanto texto como bytes, lo que causaba errores frecuentes al procesar datos en diferentes codificaciones.

El problema

En la programación diaria, a menudo nos enfrentamos a tareas de transmisión y almacenamiento de datos fuera del contexto de la información textual, por ejemplo, al trabajar con archivos, solicitudes de red y protocolos de intercambio. Para esto se necesita un tipo claro, conveniente y seguro que distinga claramente la secuencia de bytes de los datos textuales.

La solución

El tipo bytes en Python almacena una secuencia inmutable de bytes (números enteros de 0 a 255) y se puede crear a partir de un literal de bytes (con el prefijo b) o mediante una conversión explícita de tipos. Para una interacción segura y predecible entre cadenas (str) y bytes (bytes), se utilizan los métodos .encode() y .decode(). Al trabajar con archivos, redes y varios protocolos binarios, bytes es la opción principal.

Ejemplo de código:

# Creación de un objeto bytes b = b'hello' # A través de un literal b2 = bytes([104, 101, 108, 108, 111]) # De una lista de números enteros # Conversión str <=> bytes text = 'текст' bin_text = text.encode('utf-8') # str -> bytes back = bin_text.decode('utf-8') # bytes -> str # Ejemplo con un archivo with open('file.bin', 'rb') as f: data = f.read() # data: bytes

Características clave:

  • bytes es un contenedor inmutable (immutable) para una secuencia de bytes.
  • Se diferencia de str: str almacena texto (Unicode), bytes almacena datos binarios.
  • Todas las operaciones de conversión requieren especificar explícitamente la codificación.

Preguntas trampa.

¿Se pueden concatenar bytes y str en una sola variable?

No, la concatenación mediante + o cadenas f no funciona: si intentas ejecutar b'abc' + 'def', se generará un TypeError. Se necesita convertir explícitamente los tipos.

¿En qué se diferencia bytes de bytearray?

bytes es un tipo inmutable, es decir, el contenido no se puede modificar después de su creación. bytearray es una variante mutable que admite métodos para cambiar bytes en su lugar.

b = bytes([1, 2, 3]) # inmutable ba = bytearray([1, 2, 3]) # mutable ba[0] = 99 # OK b[0] = 99 # TypeError

¿Cómo saber cuántos bytes ocupará una cadena al convertirse a través de encode()?

El número de bytes depende de la codificación. Por ejemplo, para 'abc' en utf-8 son 3 bytes, y para 'Привет' son 12. Solo después de llamar a encode() se puede conocer el tamaño exacto a través de len():

s = 'Привет' # 6 letras b = s.encode('utf-8') # 12 bytes print(len(b)) # 12

Errores comunes y anti-patrones

  • Confundir bytes y str, pasar una cadena donde se esperan bytes (por ejemplo, en solicitudes HTTP, archivos binarios), o viceversa.
  • Olvidar decodificar explícitamente los bytes al escribir en un archivo de texto o al imprimir.
  • Comparar bytes y str directamente: siempre será False.

Ejemplo de la vida real

Caso negativo

Un desarrollador lee un archivo en modo 'rb' (byte) y trata de procesarlo directamente como una cadena:

with open('file.txt', 'rb') as f: for line in f: print(line.strip()) # line: bytes

Ventajas:

  • Puede funcionar para documentos ASCII.

Desventajas:

  • Para archivos Unicode, el procesamiento no es posible sin descodificación a través de decode().
  • Se generan errores al intentar concatenar con str.

Caso positivo

Un desarrollador procesa flujos de bytes a través de decode(), introduciendo control de codificación:

with open('file.txt', 'rb') as f: for line in f: print(line.decode('utf-8').strip())

Ventajas:

  • El código funciona para cualquier archivo de texto con la codificación correcta.
  • Comportamiento predecible al procesar y mostrar.

Desventajas:

  • Aparece una responsabilidad adicional por la elección explícita de la codificación.
  • Procesamiento adicional de errores en caso de una descodificación incorrecta.