Tampaknya ada dua cara berbeda untuk mengubah string menjadi byte, seperti terlihat pada jawaban untuk TypeError: 'str' tidak mendukung antarmuka buffer
Manakah dari metode ini yang lebih baik atau lebih Pythonic? Atau itu hanya masalah preferensi pribadi?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
python
string
character-encoding
python-3.x
Mark tebusan
sumber
sumber
bytes(item, "utf8")
, karena eksplisit lebih baik daripada implisit, jadi ...str.encode( )
default secara diam-diam ke byte, membuat Anda lebih Unicode-zen tetapi kurang Eksplisit-Zen. Juga "umum" bukan istilah yang ingin saya ikuti. Juga,bytes(item, "utf8")
lebih sepertistr()
, danb"string"
notasi. Saya minta maaf jika saya sangat tidak mengerti alasan Anda. Terima kasih.encode()
tidak meneleponbytes()
, itu sebaliknya. Tentu saja itu tidak segera jelas karena itulah saya mengajukan pertanyaan.Jawaban:
Jika Anda melihat dokumen untuk
bytes
, itu mengarahkan Anda kebytearray
:Jadi
bytes
bisa melakukan lebih dari sekadar menyandikan string. Ini Pythonic yang akan memungkinkan Anda untuk memanggil konstruktor dengan segala jenis parameter sumber yang masuk akal.Untuk pengkodean string, saya pikir itu
some_string.encode(encoding)
lebih Pythonic daripada menggunakan konstruktor, karena itu adalah yang paling mendokumentasikan diri - "ambil string ini dan kodekan dengan pengkodean ini" lebih jelas daripadabytes(some_string, encoding)
- tidak ada kata kerja eksplisit ketika Anda menggunakan konstruktor.Sunting: Saya memeriksa sumber Python. Jika Anda melewatkan string unicode
bytes
menggunakan CPython, ia memanggil PyUnicode_AsEncodedString , yang merupakan implementasi dariencode
; jadi Anda hanya melewatkan tingkat tipuan jika Anda memanggilencode
diri sendiri.Juga, lihat komentar Serdalis -
unicode_string.encode(encoding)
juga lebih Pythonic karena kebalikannyabyte_string.decode(encoding)
dan simetrinya bagus.sumber
unicode_string.encode(encoding)
cocok denganbytearray.decode(encoding)
ketika Anda ingin kembali string Anda.bytearray
digunakan ketika Anda membutuhkan objek yang bisa berubah. Anda tidak memerlukannya untuk konversistr
↔ sederhanabytes
.bytearray
kecuali bahwa dokumen untukbytes
tidak memberikan rincian, mereka hanya mengatakan "ini adalah versi abadibytearray
" jadi saya harus mengutip dari sana.bytes
: Hindari menggunakan tipe byte sebagai fungsi dengan argumen integer. Di v2 ini mengembalikan integer yang dikonversi ke string (byte) karena byte adalah alias untuk str, sementara di v3 ia mengembalikan bytestring yang berisi jumlah karakter null yang diberikan. Jadi, misalnya, alih-alih byte ekspresi v3 (6), gunakan setara b '\ x00' * 6, yang bekerja mulus dengan cara yang sama di setiap versi.byte_string.decode('latin-1')
karenautf-8
tidak mencakup seluruh rentang 0x00 hingga 0xFF (0-255), periksa dokumentasi python untuk Info lebih lanjut.Lebih mudah dari yang diperkirakan:
sumber
obj.method()
sintaks bukancls.method(obj)
sintaks yaitu, gunakanbytestring = unicode_text.encode(encoding)
danunicode_text = bytestring.decode(encoding)
.self
argumen pertamaencode
sebagai metode terikat pada string. Jawaban ini menunjukkan bahwa Anda sebaiknya memanggil metode tidak terikat dan meneruskannya string. Itulah satu-satunya informasi baru dalam jawabannya, dan itu salah.The benar-benar cara terbaik adalah tidak satu pun dari 2, tetapi 3. Parameter pertama ke default sejak Python 3.0. Demikian cara terbaiknya
encode
'utf-8'
Ini juga akan lebih cepat, karena argumen default tidak menghasilkan string
"utf-8"
dalam kode C, tetapiNULL
, yang jauh lebih cepat untuk diperiksa!Berikut ini beberapa timing:
Meskipun ada peringatan, waktunya sangat stabil setelah berjalan berulang kali - penyimpangannya hanya ~ 2 persen.
Menggunakan
encode()
tanpa argumen tidak kompatibel dengan Python, seperti pada Python 2 pengkodean karakter default adalah ASCII .sumber
'\u00012345'*10000
,. Keduanya mengambil 28.8us di laptop saya; 50ns tambahan mungkin hilang dalam kesalahan pembulatan. Tentu saja ini adalah contoh yang cukup ekstrem — tetapi'abc'
sama ekstrimnya dengan arah yang berlawanan.