Beste måten å konvertere streng til byte i Python 3?
Det ser ut til å være to forskjellige måter å konvertere en streng til byte på, som vist i svarene på https://stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface.
Hvilken av disse metodene ville være bedre eller mer Pythonic? Eller er det bare et spørsmål om personlig preferanse?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
718
3
Hvis du ser på dokumentasjonen for
bytes
, peker den tilbytearray
:Så
bytes
kan gjøre mye mer enn bare å kode en streng. Det er Pythonic at det vil tillate deg å ringe konstruktøren med hvilken som helst type kildeparameter som gir mening.For koding av en streng tror jeg at
some_string.encode(encoding)
er mer Pythonic enn å bruke konstruktøren, fordi det er den mest selvdokumenterende - "ta denne strengen og kod den med denne kodingen" er tydeligere ennbytes(some_string, encoding)
- det er ikke noe eksplisitt verb når du bruker konstruktøren.Edit: Jeg sjekket Python-kilden. Hvis du sender en unicode-streng til
bytes
ved hjelp av CPython, kaller den PyUnicode_AsEncodedString, som er implementeringen avencode
; så du hopper bare over et nivå av indirekte hvis du kallerencode
selv.Se også Serdalis' kommentar --
unicode_string.encode(encoding)
er også mer Pythonic fordi dens inverse erbyte_string.decode(encoding)
og symmetri er fint.Det er enklere enn man tror:
Den absolutt beste måten er ingen av de 2, men den 3. Den første parameteren til
encode
default to'utf-8'
helt siden Python 3.0. Den beste måten er derforDette vil også være raskere, fordi standardargumentet ikke resulterer i strengen
"utf-8"
i C-koden, menNULL
, som er mye raskere å sjekke!Her er noen tidsangivelser:
Til tross for advarselen var tidene veldig stabile etter gjentatte kjøringer - avviket var bare ~ 2 prosent.
Bruk av
encode()
uten et argument er ikke Python 2-kompatibelt, ettersom standard tegnkoding i Python 2 er ASCII.