¿Qué significa el prefijo ab antes de una cadena de Python?

107

En un código fuente de Python con el que me topé, he visto una b pequeña antes de una cadena como en:

b"abcdef"

Sé sobre el uprefijo que significa una cadena Unicode y el rprefijo para un literal de cadena sin formato.

¿Qué significa by en qué tipo de código fuente es útil, ya que parece ser exactamente como una cadena sin prefijo?

kriss
fuente
10
@SLott: siga el enlace que proporcionó y verá que el prefijo b no está permitido en el prefijo de cadena ... para 2.6 (parece un error menor en el material de referencia). Y buscar en Google este tipo de cosas no es fácil. Probé palabras clave como "prefijo de cadena b python" y básicamente no llegué a ninguna parte.
kriss
Al enlace que utilizó S.Lott le falta un especificador de versión; se trata de Python 3: docs.python.org/3/reference/… . El prefijo ahora también es compatible con Python 2.6 y versiones posteriores para facilitar el código de Python entre versiones.
Martijn Pieters
1
esta pregunta no es "un duplicado exacto" ni una respuesta a la pregunta "¿Puedo deshacerme de este carácter 'b' en mi declaración impresa?" stackoverflow.com/questions/42599851/… ¿Le importaría desmarcar eso, por favor, marijin? la persona que preguntó, así como la persona que realmente intentó una respuesta, podrían apreciar poder tener una respuesta a la pregunta real planteada.
yo_

Respuestas:

62

Este es Python3 bytes literal . Este prefijo está ausente en Python 2.5 y versiones anteriores (es equivalente a una cadena simple de 2.x, mientras que una cadena simple de 3.x es equivalente a un literal con uprefijo en 2.x). En Python 2.6+ es equivalente a una cadena sin formato, para la compatibilidad con 3.x .

GUERRA
fuente
@WRAR: Estaba en el código Python 2.6 Vi esto, parece que fue introducido en Python2.6
kriss
Lo verifiqué específicamente en la referencia 2.6 antes de publicar: docs.python.org/reference/lexical_analysis.html#literals
wRAR
1
OK, "Para compatibilidad futura, Python 2.6 agrega bytes como sinónimo del tipo str, y también admite la notación b ''.", De "Novedades".
wRAR
como los enlaces anteriores ahora apuntan a la referencia 2.7 y se agregó el prefijo b, aquí hay un enlace a la antigua referencia falsa docs.python.org/release/2.6.8/reference/…
kriss
98

El bprefijo significa una bytescadena literal .

Si ve que se usa en el código fuente de Python 3, la expresión crea un bytesobjeto , no un objeto Unicodestr normal . Si ve que se repite en su shell de Python o como parte de una lista, dict u otro contenido del contenedor, entonces verá un bytesobjeto representado usando esta notación.

bytesLos objetos contienen básicamente una secuencia de números enteros en el rango 0-255, pero cuando se representan, Python muestra estos bytes como puntos de código ASCII para facilitar la lectura de su contenido. Cualquier bytes fuera de la imprimible gama de caracteres ASCII se muestran como secuencias de escape (por ejemplo \n, \x82, etc.). A la inversa, puede utilizar tanto caracteres ASCII como secuencias de escape para definir valores de bytes; para valores ASCII se usa su valor numérico (por ejemplo, b'A'== b'\x41')

Dado que un bytesobjeto consta de una secuencia de números enteros, puede construir un bytesobjeto a partir de cualquier otra secuencia de números enteros con valores en el rango 0-255, como una lista:

bytes([72, 101, 108, 108, 111])

y la indexación le devuelve los enteros (pero la división produce un nuevo bytesvalor; para el ejemplo anterior, value[0]le da 72, pero value[:1]es b'H'como 72 es el punto de código ASCII para la letra H mayúscula ).

bytesmodelar datos binarios , incluido el texto codificado . Si su bytesvalor contiene texto, primero debe decodificarlo con el códec correcto. Si los datos están codificados como UTF-8, por ejemplo, puede obtener un strvalor Unicode con:

strvalue = bytesvalue.decode('utf-8')

Por el contrario, para pasar del texto de un strobjeto a bytestener que codificar . Debe decidir qué codificación utilizar; el valor predeterminado es usar UTF-8, pero lo que necesitará depende en gran medida de su caso de uso:

bytesvalue = strvalue.encode('utf-8')

También puedes usar el constructor bytes(strvalue, encoding)para hacer lo mismo.

Tanto el método de decodificación como el de codificación toman un argumento adicional para especificar cómo se deben manejar los errores .

Python 2, las versiones 2.6 y 2.7 también admiten la creación de literales de cadena utilizando b'..'la sintaxis de literal de cadena, para facilitar el código que funciona tanto en Python 2 como en 3.

byteslos objetos son inmutables, al igual que las strcadenas. Utilice un bytearray()objeto si necesita tener un valor de bytes mutable.

Martijn Pieters
fuente