Python 3.x hace una clara distinción entre los tipos:
str
= '...'
literales = una secuencia de caracteres Unicode (UTF-16 o UTF-32, dependiendo de cómo se compiló Python)
bytes
= b'...'
literales = una secuencia de octetos (enteros entre 0 y 255)
Si está familiarizado con Java o C #, piense en str
as String
y bytes
as byte[]
. Si está familiarizado con SQL, piense en str
as NVARCHAR
y bytes
as BINARY
or BLOB
. Si está familiarizado con el registro de Windows, piense str
como REG_SZ
y bytes
como REG_BINARY
. Si estás familiarizado con C (++), entonces olvida todo lo que has aprendido char
y las cadenas, porque UN CARÁCTER NO ES UN BYTE . Esa idea es obsoleta desde hace mucho tiempo.
Usas str
cuando quieres representar texto.
print('שלום עולם')
Se usa bytes
cuando desea representar datos binarios de bajo nivel como estructuras.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Puede codificar a str
a un bytes
objeto.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Y puedes decodificar a bytes
en a str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Pero no puedes mezclar libremente los dos tipos.
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
La b'...'
notación es algo confusa ya que permite que los bytes 0x01-0x7F se especifiquen con caracteres ASCII en lugar de números hexadecimales.
>>> b'A' == b'\x41'
True
Pero debo enfatizar, un personaje no es un byte .
>>> 'A' == b'A'
False
En Python 2.x
Las versiones anteriores a 3.0 de Python carecían de este tipo de distinción entre texto y datos binarios. En cambio, había:
unicode
= u'...'
literales = secuencia de caracteres Unicode = 3.xstr
str
= '...'
literales = secuencias de bytes / caracteres confundidos
- Por lo general, texto codificado en alguna codificación no especificada.
- Pero también se usa para representar datos binarios como
struct.pack
salida.
Para facilitar la transición de 2.x a 3.x, la b'...'
sintaxis literal se hizo retroceder a Python 2.6, para permitir distinguir cadenas binarias (que deberían estar bytes
en 3.x) de cadenas de texto (que deberían estar str
en 3 .X). El b
prefijo no hace nada en 2.x, pero le dice al 2to3
script que no lo convierta a una cadena Unicode en 3.x.
Entonces sí, los b'...'
literales en Python tienen el mismo propósito que en PHP.
Además, solo por curiosidad, ¿hay más símbolos que el byu que hacen otras cosas?
El r
prefijo crea una cadena sin formato (p. Ej., r'\t'
Es una barra invertida + en t
lugar de una pestaña), y las comillas triples '''...'''
o """..."""
permiten literales de cadena de varias líneas.