A melhor maneira de converter cordas em bytes em Python 3?
Parece haver duas formas diferentes de converter uma corda em bytes, como se vê nas respostas a https://stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface
Qual destes métodos seria melhor ou mais pítonico? Ou é apenas uma questão de preferência pessoal?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
718
3
Se você olhar os documentos para "bytes", ele aponta para
bytearray
:Então "bytes" pode fazer muito mais do que codificar uma string. It's Pythonic que permite que você chame o construtor com qualquer tipo de parâmetro de fonte que faça sentido.
Para codificar uma string, eu acho que
some_string.encode(encoding)
é mais Pythonic do que utilizar o construtor, porque ele é o mais auto documentado -- "pegue esta string e codifique-a com esta codificação" é mais claro quebytes(some_string, encoding)
-- não há verbo explícito quando você utiliza o construtor.Edit: Eu verifiquei a fonte Python. Se você passar uma string unicode para
bytes
utilizando CPython, ela chama PyUnicode_AsEncodedString, que é a implementação doencode
; então você'está apenas pulando um nível de indireção se você mesmo chamar oencode
.Também, veja Serdalis' comente --
unicode_string.encode(encoding)
também é mais Pythonic porque seu inverso ébyte_string.decode(encoding)
e a simetria é agradável.It's mais fácil do que se pensa:
O absolutamente melhor caminho não é nenhum dos dois, mas o terceiro. O primeiro parâmetro para
encode
defaults to'utf-8'
desde Python 3.0. Assim, a melhor maneira éIsso também será mais rápido, porque o argumento padrão não resulta na string
"utf-8"
no código C, masNULL
, que é muito mais rápido para verificar!Aqui estão alguns horários:
Apesar do aviso, os tempos foram muito estáveis após repetidas corridas - o desvio foi de apenas ~2 por cento.
Utilizando
encode()
sem um argumento não é compatível com Python 2, pois em Python 2 a codificação de caracteres padrão é ASCII.