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
como String
e bytes
como byte[]
. Se você conhece o SQL, pense em str
como NVARCHAR
e bytes
como BINARY
ou BLOB
. Se você estiver familiarizado com o registro do Windows, pense em str
como REG_SZ
e bytes
como REG_BINARY
. Se você conhece C (++), esqueça tudo o que aprendeu char
e as strings, porque UM PERSONAGEM NÃO É UM BYTE . Essa ideia é obsoleta há muito tempo.
Você usa str
quando deseja representar texto.
print('שלום עולם')
Você usa bytes
quando deseja representar dados binários de baixo nível, como estruturas.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Você pode codificar a str
para um bytes
objeto.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
E você pode decodificar a bytes
em a str
.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Mas você não pode misturar livremente os dois tipos.
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
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.
>>> b'A' == b'\x41'
True
Mas devo enfatizar que um personagem não é um byte .
>>> 'A' == b'A'
False
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 confusos
- Geralmente texto, codificado em alguma codificação não especificada.
- Mas também usado para representar dados binários como
struct.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 estar bytes
em 3.x) e cadeias de texto (que devem estar str
em 3 .x). O b
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.
Além disso, por curiosidade, existem mais símbolos do que b e u que fazem outras coisas?
O r
prefixo cria uma sequência bruta (por exemplo, r'\t'
é uma barra invertida + em t
vez de uma guia) e aspas triplas '''...'''
ou """..."""
permite literais de sequências de várias linhas.