O que significa o prefixo ab antes de uma string python?

107

Em um código-fonte python que encontrei, vi um pequeno b antes de uma string como em:

b"abcdef"

Eu sei sobre o uprefixo que significa uma string Unicode e o rprefixo para um literal de string bruto.

O que bsignifica e em que tipo de código-fonte é útil, pois parece ser exatamente como uma string simples sem qualquer prefixo?

Kriss
fonte
10
@SLott: siga o link que você forneceu, você verá que o prefixo b não é permitido no prefixo da string ... para 2.6 (parece um pequeno erro no material de referência). E pesquisar no Google sobre esse tipo de coisa não é fácil. Tentei palavras-chave como "b python string prefix" e basicamente não consegui nada.
Kriss
O link S.Lott usado não tem um especificador de versão; trata-se do Python 3: docs.python.org/3/reference/… . O prefixo agora também é compatível com Python 2.6 e superior para facilitar o código Python de versão cruzada.
Martijn Pieters
1
essa pergunta não é "uma duplicata exata" nem uma resposta à pergunta "Posso me livrar desse caractere 'b' em minha declaração impressa?" stackoverflow.com/questions/42599851/… você se importaria de desmarcar isso, marijin? a pessoa que perguntou, bem como a pessoa que realmente tentou uma resposta, pode apreciar ser capaz de ter uma resposta para a pergunta real colocada.
me_

Respostas:

62

Este é o bytes literal Python3 . Este prefixo está ausente no Python 2.5 e anteriores (é equivalente a uma string simples de 2.x, enquanto uma string simples de 3.x é equivalente a um literal com uprefixo em 2.x). Em Python 2.6+ é equivalente a uma cadeia simples, para compatibilidade com 3.x .

wRAR
fonte
@WRAR: Foi no código python 2.6 que vi isso, parece que foi introduzido no python2.6
kriss
Eu verifiquei especificamente na referência 2.6 antes de postar: docs.python.org/reference/lexical_analysis.html#literals
wRAR
1
OK, "Para compatibilidade futura, Python 2.6 adiciona bytes como um sinônimo para o tipo str e também suporta a notação b ''.", De "O que há de novo".
wRAR
como os links acima agora apontam para a referência 2.7 e o prefixo b foi adicionado, aqui está um link para a antiga referência falsa docs.python.org/release/2.6.8/reference/…
kriss
98

O bprefixo significa um bytesliteral de string .

Se você vê-lo usado no código-fonte do Python 3, a expressão cria um bytesobjeto , não um objeto Unicodestr regular . Se você vê-lo ecoado em seu shell Python ou como parte de uma lista, dict ou outro conteúdo de contêiner, então você vê um bytesobjeto representado usando esta notação.

bytesos objetos contêm basicamente uma sequência de inteiros no intervalo de 0 a 255, mas quando representados, o Python exibe esses bytes como pontos de código ASCII para facilitar a leitura de seu conteúdo. Quaisquer bytes fora da impressão gama de caracteres ASCII são mostrados como sequências de escape (por exemplo \n, \x82, etc.). Inversamente, você pode usar caracteres ASCII e sequências de escape para definir valores de byte; para valores ASCII, seu valor numérico é usado (por exemplo, b'A'== b'\x41')

Como um bytesobjeto consiste em uma sequência de inteiros, você pode construir um bytesobjeto a partir de qualquer outra sequência de inteiros com valores no intervalo 0-255, como uma lista:

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

e a indexação retorna os inteiros (mas o fatiamento produz um novo bytesvalor; para o exemplo acima, value[0]fornece 72, mas value[:1]é b'H'como 72 é o ponto de código ASCII para a letra maiúscula H ).

bytesmodelar dados binários , incluindo texto codificado . Se o seu bytesvalor contiver texto, você precisa primeiro decodificá-lo, usando o codec correto. Se os dados estiverem codificados como UTF-8, por exemplo, você pode obter um strvalor Unicode com:

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

Por outro lado, para ir do texto em um strobjeto para bytesvocê precisa codificar . Você precisa decidir sobre uma codificação a ser usada; o padrão é usar UTF-8, mas o que você precisa depende muito do seu caso de uso:

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

Você também pode usar o construtor bytes(strvalue, encoding)para fazer o mesmo.

Os métodos de decodificação e codificação usam um argumento extra para especificar como os erros devem ser tratados .

O Python 2, versões 2.6 e 2.7 também oferece suporte à criação de literais de string usando b'..'a sintaxe de literal de string para facilitar o código que funciona em Python 2 e 3.

bytesos objetos são imutáveis, assim como as strstrings. Use um bytearray()objeto se precisar ter um valor de bytes mutável.

Martijn Pieters
fonte