Aparentemente, o seguinte é a sintaxe válida:
my_string = b'The string'
Eu gostaria de saber:
- O que esse
b
caractere na frente da string significa? - Quais são os efeitos de usá-lo?
- Quais são as situações apropriadas para usá-lo?
Eu encontrei uma pergunta relacionada aqui no SO, mas essa pergunta é sobre PHP e afirma que b
é usada para indicar que a string é binária, em oposição ao Unicode, que era necessário para que o código fosse compatível com a versão do PHP <6 , ao migrar para o PHP 6. Acho que isso não se aplica ao Python.
Encontrei esta documentação no site Python sobre o uso de um u
caractere na mesma sintaxe para especificar uma string como Unicode. Infelizmente, ele não menciona o caractere b em nenhum lugar desse documento.
Além disso, apenas por curiosidade, há mais símbolos do que o b
e u
que fazer outras coisas?
unicode_literals
a partir__future__
, isso vai "reverter" o comportamento para esta corda particular (em Python 2.x)O Python 3.x faz uma distinção clara entre os tipos:
str
='...'
literais = uma sequência de caracteres Unicode (UTF-16 ou UTF-32, dependendo de como o Python foi compilado)bytes
=b'...'
literais = uma sequência de octetos (números inteiros entre 0 e 255)Se você conhece Java ou C #, pense em
str
comoString
ebytes
comobyte[]
. Se você conhece o SQL, pense emstr
comoNVARCHAR
ebytes
comoBINARY
ouBLOB
. Se você estiver familiarizado com o registro do Windows, pense emstr
comoREG_SZ
ebytes
comoREG_BINARY
. Se você conhece C (++), esqueça tudo o que aprendeuchar
e as strings, porque UM PERSONAGEM NÃO É UM BYTE . Essa ideia é obsoleta há muito tempo.Você usa
str
quando deseja representar texto.Você usa
bytes
quando deseja representar dados binários de baixo nível, como estruturas.Você pode codificar a
str
para umbytes
objeto.E você pode decodificar a
bytes
em astr
.Mas você não pode misturar livremente os dois tipos.
A
b'...'
notação é um pouco confusa, pois permite que os bytes 0x01-0x7F sejam especificados com caracteres ASCII em vez de números hexadecimais.Mas devo enfatizar que um personagem não é um byte .
No Python 2.x
As versões pré-3.0 do Python não tinham esse tipo de distinção entre texto e dados binários. Em vez disso, havia:
unicode
=u'...'
literais = sequência de caracteres Unicode = 3.xstr
str
='...'
literais = sequências de bytes / caracteres confusosstruct.pack
saída.Para facilitar a transição 2.x para 3.x, a
b'...'
sintaxe literal foi suportada para o Python 2.6, a fim de permitir a distinção entre cadeias binárias (que devem estarbytes
em 3.x) e cadeias de texto (que devem estarstr
em 3 .x). Ob
prefixo não faz nada no 2.x, mas informa ao2to3
script para não convertê-lo em uma seqüência de caracteres Unicode no 3.x.Então, sim,
b'...'
literais em Python têm o mesmo propósito que eles têm em PHP.O
r
prefixo cria uma sequência bruta (por exemplo,r'\t'
é uma barra invertida + emt
vez de uma guia) e aspas triplas'''...'''
ou"""..."""
permite literais de sequências de várias linhas.fonte
'A' == b'A' --> False
cheque realmente deixa claro. O resto é excelente, mas até aquele momento eu não havia entendido direito que uma sequência de bytes não'שלום עולם' == 'hello world'
OB indica uma cadeia de bytes.
Bytes são os dados reais. Strings são uma abstração.
Se você tivesse um objeto de seqüência de caracteres múltiplos e utilizasse um único caractere, seria uma sequência e pode ter mais de 1 byte de tamanho, dependendo da codificação.
Se você digitar 1 byte com uma string de bytes, você obterá um único valor de 8 bits de 0 a 255 e pode não representar um caractere completo se esses caracteres devido à codificação forem> 1 byte.
TBH eu usaria strings, a menos que tivesse algum motivo específico de baixo nível para usar bytes.
fonte
Do lado do servidor, se enviarmos alguma resposta, ela será enviada na forma de tipo de byte e, portanto, aparecerá no cliente como
b'Response from server'
Para se livrar de
b'....'
simplesmente use o código abaixo:Arquivo do servidor:
Arquivo do cliente:
então ele imprimirá
Response from server
fonte
Aqui está um exemplo em que a ausência de
b
lançaria umaTypeError
exceção no Python 3.xAdicionar um
b
prefixo resolveria o problema.fonte
Ele o transforma em um
bytes
literal (oustr
em 2.x) e é válido para 2.6+.O
r
prefixo faz com que as barras invertidas para ser "uninterpreted" (não ignorada, ea diferença faz matéria).fonte
str
no 2.x de qualquer maneira, portanto, pode-se dizer que é ignorado. A distinção importa quando você importaunicode_literals
do__future__
módulo.Além do que os outros disseram, observe que um único caractere no unicode pode consistir em vários bytes .
A maneira como o unicode funciona é que ele pegou o formato ASCII antigo (código de 7 bits que se parece com 0xxx xxxx) e adicionou sequências de vários bytes em que todos os bytes começam com 1 (1xxx xxxx) para representar os caracteres além do ASCII, para que o Unicode fosse retrocedido. -compatível com ASCII.
fonte
Você pode usar JSON para convertê-lo em dicionário
{"valor chave"}
FRASCO:
Este é um exemplo do balão. Execute isso na linha do terminal:
No flask / routes.py
{'valor chave'}
fonte