Bedste måde at konvertere streng til bytes i Python 3?
Der synes at være to forskellige måder at konvertere en streng til bytes på, som det fremgår af svarene på https://stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface
Hvilken af disse metoder ville være bedre eller mere pythonisk? Eller er det bare et spørgsmål om personlige præferencer?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
718
3
Hvis du kigger i dokumentationen for
bytes
, peger den påbytearray
:Så
bytes
kan gøre meget mere end blot at kode en streng. Det'er Pythonisk, at det ville tillade dig at kalde konstruktøren med enhver type kildeparameter, der giver mening.Til kodning af en streng synes jeg, at
some_string.encode(encoding)
er mere Pythonisk end at bruge konstruktøren, fordi det er det mest selvdokumenterende -- "take this string and encode it with this encoding" er klarere endbytes(some_string, encoding)
-- der er ikke noget eksplicit verbum, når du bruger konstruktøren.Rediger: Jeg har tjekket Python-kilden. Hvis du overdrager en unicode-streng til
bytes
ved hjælp af CPython, kalder den PyUnicode_AsEncodedString, som er implementeringen afencode
; så du springer bare et indirekte niveau over, hvis du selv kalderencode
.Se også Serdalis' kommentar --
unicode_string.encode(encoding)
er også mere Pythonisk, fordi dens inverse erbyte_string.decode(encoding)
og symmetri er rart.Det er nemmere, end man tror:
Den absolut bedste måde er ingen af de to, men den tredje. Den første parameter til
encode
er default til*'utf-8'
lige siden Python 3.0. Derfor er den bedste måde at gøre det påDette vil også være hurtigere, fordi standardargumentet ikke resulterer i strengen
&"utf-8"
i C-koden, menNULL
, hvilket er meget hurtigere at kontrollere!Her er nogle tidsangivelser:
På trods af advarslen var tiderne meget stabile efter gentagne kørsler - afvigelsen var kun ~2 procent.
Brug af
encode()
uden et argument er ikke Python 2-kompatibelt, da standardtegnkodningen i Python 2 er ASCII.