2010-04-07 12 views
69

en un código fuente de Python me topé con que he visto una pequeña b antes de una cadena como en:¿Qué significa un prefijo b antes de una cadena de python?

b"abcdef" 

que sé sobre el u prefijo que significa una cadena Unicode, y la r prefijo para un literal de cadena sin procesar.

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

+10

@SLott: siga el enlace que proporcionó verá que el prefijo b no está ** permitido ** en prefijo de cadena ... para 2.6 (parece un error menor en el material de referencia). Y buscar en Google sobre este tipo de cosas no es fácil. Probé palabras clave como "b python string prefix" y prácticamente no llegué a ninguna parte. – kriss

+0

El enlace S.Lott utilizado le falta un especificador de versión; esto es sobre Python 3: https://docs.python.org/3/reference/lexical_analysis.html#string-literals. El prefijo está ahora también apoyó en [Python 2.6 y up] (https://docs.python.org/2/whatsnew/2.6.html#pep-3112-byte-literals) para facilitar transversal versión del código Python. –

+1

esta pregunta no es ni "un duplicado exacto" ni una respuesta a la pregunta "¿Puedo deshacerme de este carácter 'b' en mi declaración de impresión?" http://stackoverflow.com/questions/42599851/can-i-get-rid-of-this-b-character-in-my-print-statement/42599902#42599902 ¿le importaría que desmarcándolos favor Marijin? la persona que preguntó, así como la persona que realmente intentó una respuesta, apreciarían poder tener una respuesta a la pregunta real planteada. –

Respuesta

43

Esto es Python3 bytesliteral. Este prefijo está ausente en Python 2.5 y versiones anteriores (es equivalente a una cadena simple de 2.x, mientras que la cadena simple de 3.x es equivalente a un literal con el prefijo u en 2.x). En Python 2.6+ es equivalente a una cadena simple, for compatibility with 3.x.

+0

@WRAR: estuvo en Python 2.6 código vi esto, parece que se introdujo en python2.6 – kriss

+0

Me específicamente comprobado en la referencia 2.6 antes de la publicación: http://docs.python.org/reference/lexical_analysis.html#literals – wRAR

+1

bien, "para la compatibilidad futura, Python 2.6 añade bytes como sinónimo para el tipo str, y también es compatible con la b '' notación.", de la "Novedades". – wRAR

55

El prefijo b significa bytes string literal.

Si lo ve utilizado en el código fuente de Python 3, la expresión crea un bytes object, no un Unicode str object normal. Si ve que se hizo eco en su shell de Python o como parte de una lista, dict u otro contenido del contenedor, verá un objeto bytes representado utilizando esta notación.

bytes objetos contienen básicamente una secuencia de 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 sus contenidos. Cualquier bytes fuera de la imprimible gama de caracteres ASCII se muestran como secuencias de escape (por ejemplo \n, \x82, etc.).

Dado que un objeto bytes consisten en una secuencia de números enteros, se puede construir un objeto bytes de cualquier otra secuencia de números enteros con valores en el rango 0-255, como una lista:

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

bytes modelo datos binarios, incluido texto codificado. Si su valor bytes contiene texto, primero debe descodificarlo, utilizando el códec correcto. Si los datos se codifica como UTF-8, por ejemplo, se puede obtener un str valor Unicode con:

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

A la inversa, para ir de texto de un objeto str a bytes que necesita para codificar. Debe decidir sobre una codificación para usar; el valor por defecto es utilizar UTF-8, pero lo que se necesita depende de su caso de uso altamente:

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

También puede utilizar el constructor, a hacer lo mismo.

Tanto la codificación y decodificación métodos toman un argumento adicional para specify how errors should be handled.

Python 2, las versiones 2.6 y 2.7 también admite la creación de literales de cadenas usando la sintaxis literal de cadenas b'..', para facilitar el código que funciona en Python 2 y 3.

Cuestiones relacionadas