Parece haver duas maneiras diferentes de converter uma seqüência de caracteres em bytes, como visto nas respostas para TypeError: 'str' não suporta a interface do buffer
Qual desses métodos seria melhor ou mais pitônico? Ou é apenas uma questão de preferência pessoal?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
python
string
character-encoding
python-3.x
Mark Ransom
fonte
fonte
bytes(item, "utf8")
, já que o explícito é melhor do que implícito, então ... ostr.encode( )
padrão é o de bytes silenciosos, tornando-o mais Unicode-zen, mas menos Zen-Explícito. Também "comum" não é um termo que eu gosto de seguir. Além disso,bytes(item, "utf8")
é mais parecido com osstr()
eb"string"
notações. Peço desculpas se eu sou tão noob para entender suas razões. Obrigado.encode()
não chamabytes()
, é o contrário. Claro que isso não é imediatamente óbvio, e foi por isso que fiz a pergunta.Respostas:
Se você olhar para os documentos
bytes
, ele indicabytearray
:Portanto,
bytes
pode fazer muito mais do que apenas codificar uma string. É Pythonic que permite chamar o construtor com qualquer tipo de parâmetro de origem que faça sentido.Para codificar uma string, acho que
some_string.encode(encoding)
é mais pitonico do que usar o construtor, porque é o mais documentado - "pegue essa string e codifique-a com essa codificação" é mais claro quebytes(some_string, encoding)
- não há verbo explícito quando você usa o construtor.Edit: Eu verifiquei a fonte Python. Se você passar uma string unicode para
bytes
usar o CPython, ela chamará PyUnicode_AsEncodedString , que é a implementação deencode
; então você está pulando um nível de indireção se você se chamarencode
.Veja também o comentário de Serdalis -
unicode_string.encode(encoding)
também é mais pitônico, porque é inversobyte_string.decode(encoding)
e simétrico.fonte
unicode_string.encode(encoding)
combina muito bem combytearray.decode(encoding)
quando você deseja que sua string volte.bytearray
é usado quando você precisa de um objeto mutável. Você não precisa dele para simplesstr
↔bytes
conversões.bytearray
exceto que os documentosbytes
não dão detalhes, eles apenas dizem "esta é uma versão imutável debytearray
", então eu tenho que citar a partir daí.bytes
: Evite usar o tipo de bytes como uma função com um argumento inteiro. Na v2, isso retorna o número inteiro convertido em uma string (byte) porque bytes é um alias para str, enquanto na v3 ele retorna uma cadeia de bytes contendo o número especificado de caracteres nulos. Portanto, por exemplo, em vez da expressão v3 bytes (6), use o equivalente b '\ x00' * 6, que funciona perfeitamente da mesma maneira em cada versão.byte_string.decode('latin-1')
comoutf-8
não cobre toda a faixa de 0x00 a 0xFF (0-255), confira os python docs para mais informações.É mais fácil do que se pensa:
fonte
obj.method()
sintaxe em vez decls.method(obj)
sintaxe, ou seja, usebytestring = unicode_text.encode(encoding)
eunicode_text = bytestring.decode(encoding)
.self
como o primeiro argumentoencode
como um método vinculado na string. Esta resposta sugere que você deve chamar o método não acoplado e passar a string. Essa é a única informação nova na resposta e está errada.A melhor maneira absolutamente não é dos 2, mas do 3º. O primeiro parâmetro para o padrão desde o Python 3.0. Assim, a melhor maneira é
encode
'utf-8'
Isso também será mais rápido, porque o argumento padrão não resulta na sequência
"utf-8"
do código C, masNULL
é muito mais rápida de verificar!Aqui estão alguns horários:
Apesar do aviso, os tempos eram muito estáveis após repetidas corridas - o desvio era de apenas 2%.
O uso
encode()
sem argumento não é compatível com Python 2, pois no Python 2 a codificação de caracteres padrão é ASCII .fonte
'\u00012345'*10000
,. Ambos levam 28.8us no meu laptop; presumivelmente, os 50ns extras são perdidos no erro de arredondamento. Claro que este é um exemplo bastante extremo - mas'abc'
é igualmente extremo na direção oposta.