Rupanya, berikut ini adalah sintaks yang valid:
my_string = b'The string'
Saya ingin tahu:
- Apa arti
b
karakter ini di depan string? - Apa efek dari menggunakannya?
- Apa situasi yang tepat untuk menggunakannya?
Saya menemukan pertanyaan terkait di sini pada SO, tetapi pertanyaan itu adalah tentang PHP, dan menyatakan b
digunakan untuk menunjukkan string adalah biner, bukan Unicode, yang diperlukan untuk kode agar kompatibel dari versi PHP <6 , ketika bermigrasi ke PHP 6. Saya tidak berpikir ini berlaku untuk Python.
Saya memang menemukan dokumentasi ini di situs Python tentang menggunakan u
karakter dalam sintaksis yang sama untuk menentukan string sebagai Unicode. Sayangnya, itu tidak menyebutkan karakter b di manapun dalam dokumen itu.
Juga, hanya karena penasaran, apakah ada lebih banyak simbol daripada b
dan u
yang melakukan hal-hal lain?
unicode_literals
dari__future__
, ini akan "membalikkan" perilaku untuk string khusus ini (dengan Python 2.x)Python 3.x membuat perbedaan yang jelas antara jenis:
str
='...'
literal = urutan karakter Unicode (UTF-16 atau UTF-32, tergantung pada bagaimana Python dikompilasi)bytes
=b'...'
literal = urutan oktet (bilangan bulat antara 0 dan 255)Jika Anda terbiasa dengan Java atau C #, pikirkan
str
sebagaiString
danbytes
sebagaibyte[]
. Jika Anda terbiasa dengan SQL, pikirkanstr
asNVARCHAR
danbytes
asBINARY
atauBLOB
. Jika Anda terbiasa dengan registri Windows, pikirkanstr
sebagaiREG_SZ
danbytes
sebagaiREG_BINARY
. Jika Anda terbiasa dengan C (++), lupakan semua yang telah Anda pelajarichar
dan string, karena KARAKTER BUKAN BYTE . Gagasan itu sudah lama usang.Anda gunakan
str
saat Anda ingin merepresentasikan teks.Anda gunakan
bytes
saat Anda ingin merepresentasikan data biner tingkat rendah seperti struct.Anda dapat mengkodekan suatu
str
kebytes
objek.Dan Anda dapat memecahkan kode
bytes
menjadistr
.Tetapi Anda tidak dapat dengan bebas mencampurkan kedua jenis itu.
The
b'...'
notasi agak membingungkan dalam yang memungkinkan byte 0x01-0x7F akan ditentukan dengan karakter ASCII bukan nomor hex.Tapi saya harus menekankan, karakter bukan byte .
Dalam Python 2.x
Versi Pra-3.0 Python tidak memiliki perbedaan antara teks dan data biner. Sebaliknya, ada:
unicode
=u'...'
literal = urutan karakter Unicode = 3.xstr
str
='...'
literal = urutan byte / karakter yang dikacaukanstruct.pack
keluaran.Untuk memudahkan transisi 2.x ke 3.x,
b'...'
sintaks literal di-backport ke Python 2.6, untuk memungkinkan pembeda string biner (yang harusbytes
dalam 3.x) dari string teks (yang harusstr
dalam 3 .x). Theb
prefix tidak apa-apa di 2.x, tapi menceritakan2to3
naskah untuk tidak mengubahnya ke string Unicode di 3.x.Jadi ya,
b'...'
literal dalam Python memiliki tujuan yang sama dengan yang mereka lakukan dalam PHP.The
r
prefix menciptakan string mentah (misalnya,r'\t'
adalah backslash +t
bukan tab), dan kutipan tiga'''...'''
atau"""..."""
memungkinkan multi-line string literal.sumber
'A' == b'A' --> False
cek benar-benar membuatnya jelas. Sisanya sangat bagus, tetapi sampai saat itu saya belum benar memahami bahwa byte string sebenarnya bukan teks.'שלום עולם' == 'hello world'
B menunjukkan string byte.
Bytes adalah data aktual. String adalah abstraksi.
Jika Anda memiliki objek string multi-karakter dan Anda mengambil satu karakter, itu akan menjadi string, dan ukurannya mungkin lebih dari 1 byte tergantung pada pengkodean.
Jika mengambil 1 byte dengan string byte, Anda akan mendapatkan nilai 8-bit dari 0-255 dan itu mungkin tidak mewakili karakter lengkap jika karakter yang disebabkan oleh pengkodean itu> 1 byte.
TBH Saya akan menggunakan string kecuali saya punya alasan khusus tingkat rendah untuk menggunakan byte.
sumber
Dari sisi server, jika kami mengirim respons, itu akan dikirim dalam bentuk tipe byte, sehingga akan muncul di klien sebagai
b'Response from server'
Untuk menghilangkan
b'....'
cukup gunakan kode di bawah ini:File server:
File klien:
maka akan dicetak
Response from server
sumber
Berikut adalah contoh di mana tidak adanya
b
akan melemparTypeError
pengecualian di Python 3.xMenambahkan
b
awalan akan memperbaiki masalah.sumber
Ini mengubahnya menjadi
bytes
literal (ataustr
dalam 2.x), dan valid untuk 2.6+.The
r
awalan menyebabkan backslashes untuk "uninterpreted" (tidak diabaikan, dan perbedaan tidak peduli).sumber
str
dalam 2.x cara baik, sehingga dapat dikatakan bahwa itu diabaikan. Perbedaannya penting ketika Anda mengimporunicode_literals
dari__future__
modul.Selain apa yang dikatakan orang lain, perhatikan bahwa satu karakter dalam unicode dapat terdiri dari beberapa byte .
Cara unicode bekerja adalah mengambil format ASCII lama (kode 7-bit yang terlihat seperti 0xxx xxxx) dan menambahkan urutan multi-byte di mana semua byte dimulai dengan 1 (1xxx xxxx) untuk mewakili karakter di luar ASCII sehingga Unicode akan mundur -kompatibel dengan ASCII.
sumber
Anda dapat menggunakan JSON untuk mengubahnya menjadi kamus
{"key": "value"}
LABU:
Ini adalah contoh dari labu. Jalankan ini di jalur terminal:
Di labu / routes.py
{'key': 'value'}
sumber