Aparentemente, la siguiente es la sintaxis válida:
my_string = b'The string'
Me gustaría saber:
- ¿Qué significa este
b
personaje delante de la cadena? - ¿Cuáles son los efectos de usarlo?
- ¿Cuáles son las situaciones apropiadas para usarlo?
Encontré una pregunta relacionada aquí en SO, pero esa pregunta es sobre PHP y dice que b
se usa para indicar que la cadena es binaria, a diferencia de Unicode, que era necesaria para que el código fuera compatible con la versión de PHP <6 , al migrar a PHP 6. No creo que esto se aplique a Python.
Encontré esta documentación en el sitio de Python sobre el uso de un u
carácter en la misma sintaxis para especificar una cadena como Unicode. Desafortunadamente, no menciona el carácter b en ninguna parte de ese documento.
Además, solo por curiosidad, ¿hay más símbolos que el b
y u
que hacen otras cosas?
unicode_literals
desde__future__
, esto "revertirá" el comportamiento de esta cadena en particular (en Python 2.x)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
asString
ybytes
asbyte[]
. Si está familiarizado con SQL, piense enstr
asNVARCHAR
ybytes
asBINARY
orBLOB
. Si está familiarizado con el registro de Windows, piensestr
comoREG_SZ
ybytes
comoREG_BINARY
. Si estás familiarizado con C (++), entonces olvida todo lo que has aprendidochar
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.Se usa
bytes
cuando desea representar datos binarios de bajo nivel como estructuras.Puede codificar a
str
a unbytes
objeto.Y puedes decodificar a
bytes
en astr
.Pero no puedes mezclar libremente los dos tipos.
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.Pero debo enfatizar, un personaje no es un byte .
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 confundidosstruct.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 estarbytes
en 3.x) de cadenas de texto (que deberían estarstr
en 3 .X). Elb
prefijo no hace nada en 2.x, pero le dice al2to3
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.El
r
prefijo crea una cadena sin formato (p. Ej.,r'\t'
Es una barra invertida + ent
lugar de una pestaña), y las comillas triples'''...'''
o"""..."""
permiten literales de cadena de varias líneas.fuente
'A' == b'A' --> False
cheque realmente lo deja claro. El resto es excelente, pero hasta ese momento no había entendido correctamente que una cadena de bytes no'שלום עולם' == 'hello world'
La b denota una cadena de bytes.
Los bytes son los datos reales. Las cadenas son una abstracción.
Si tuviera un objeto de cadena de caracteres múltiples y tomó un solo carácter, sería una cadena y podría tener más de 1 byte de tamaño dependiendo de la codificación.
Si toma 1 byte con una cadena de bytes, obtendría un solo valor de 8 bits de 0-255 y podría no representar un carácter completo si esos caracteres debido a la codificación eran> 1 byte.
TBH Usaría cadenas a menos que tuviera alguna razón específica de bajo nivel para usar bytes.
fuente
Desde el lado del servidor, si enviamos alguna respuesta, se enviará en forma de tipo de byte, por lo que aparecerá en el cliente como
b'Response from server'
Para deshacerse de
b'....'
simplemente use el siguiente código:Archivo del servidor:
Archivo de cliente:
entonces imprimirá
Response from server
fuente
Aquí hay un ejemplo donde la ausencia de
b
arrojaría unaTypeError
excepción en Python 3.xAgregar un
b
prefijo solucionaría el problema.fuente
Lo convierte en un
bytes
literal (ostr
en 2.x), y es válido para 2.6+.El
r
prefijo hace que las barras invertidas sean "no interpretadas" (no se ignoran, y la diferencia sí importa).fuente
str
2.x de cualquier manera, por lo que se podría decir que se ignora. La distinción es importante cuando importaunicode_literals
desde el__future__
módulo.Además de lo que otros han dicho, tenga en cuenta que un solo carácter en Unicode puede constar de múltiples bytes .
La forma en que funciona Unicode es que tomó el antiguo formato ASCII (código de 7 bits que se parece a 0xxx xxxx) y agregó secuencias de múltiples bytes donde todos los bytes comienzan con 1 (1xxx xxxx) para representar caracteres más allá de ASCII para que Unicode esté al revés -compatible con ASCII.
fuente
Puedes usar JSON para convertirlo a diccionario
{"valor clave"}
MATRAZ:
Este es un ejemplo de matraz. Ejecute esto en la línea de terminal:
En matraz / routes.py
{'valor clave'}
fuente