Python 3'te dizeyi bayta dönüştürmenin en iyi yolu?
https://stackoverflow.com/questions/5471158/typeerror-str-does-not-support-the-buffer-interface adresindeki yanıtlarda görüldüğü gibi, bir dizeyi bayta dönüştürmenin iki farklı yolu var gibi görünüyor
Bu yöntemlerden hangisi daha iyi veya daha Pythonic olurdu? Yoksa bu sadece kişisel bir tercih meselesi mi?
b = bytes(mystring, 'utf-8')
b = mystring.encode('utf-8')
718
3
Eğer
bytes
için dokümanlara bakarsanız, sizibytearray
adresine yönlendirir:Eğer bir dizeyse, kodlama (ve isteğe bağlı olarak hatalar) parametrelerini de vermelisiniz; bytearray() daha sonra str.encode() kullanarak dizeyi baytlara dönüştürür.__
Yani
bytes
bir dizeyi kodlamaktan çok daha fazlasını yapabilir. Pythonic, yapıcıyı mantıklı olan herhangi bir kaynak parametre türüyle çağırmanıza izin verecektir.Bir dizgiyi kodlamak için,
some_string.encode(encoding)
yapıcıyı kullanmaktan daha Pythonic olduğunu düşünüyorum, çünkü en çok kendini belgeliyor -- "bu dizgiyi al ve bu kodlama ile kodla"bytes(some_string, encoding)
'den daha açık -- yapıcıyı kullandığınızda açık bir fiil yok.Düzenleme: Python kaynağını kontrol ettim. CPython kullanarak
bytes
'a bir unicode string iletirseniz,encode
'un uygulaması olan PyUnicode_AsEncodedString'i çağırır; yaniencode
'u kendiniz çağırırsanız sadece bir dolaylama seviyesini atlamış olursunuz.Ayrıca, Serdalis' yorumuna bakın --
unicode_string.encode(encoding)
aynı zamanda daha Pisoniktir çünkü tersibyte_string.decode(encoding)
ve simetri güzeldir.Düşünüldüğünden daha kolaydır:
Kesinlikle en iyi yol bu ikisinden biri değil, üçüncüsüdür. Python 3.0'dan beri
encode
defaults to*'utf-8'
için ilk parametre. Bu nedenle en iyi yolBu aynı zamanda daha hızlı olacaktır, çünkü varsayılan argüman C kodunda
"utf-8"
dizesiyle değil, kontrol edilmesi çok daha hızlı olanNULL
ile sonuçlanır!İşte bazı zamanlamalar:
Uyarıya rağmen, tekrarlanan çalıştırmalardan sonra süreler çok istikrarlıydı - sapma sadece ~ yüzde 2 idi.
Python 2'de varsayılan karakter kodlaması ASCII olduğu için
encode()
işlevini argüman olmadan kullanmak Python 2 ile uyumlu değildir.