Najwyraźniej następująca poprawna składnia:
my_string = b'The string'
Chciałbym wiedzieć:
- Co oznacza ten
b
znak przed sznurkiem? - Jakie są skutki korzystania z niego?
- Jakie są odpowiednie sytuacje, aby z niego skorzystać?
Znalazłem pokrewne pytanie tutaj na SO, ale to pytanie dotyczy PHP i stwierdza, że b
służy do wskazania, że łańcuch jest binarny, w przeciwieństwie do Unicode, który był potrzebny, aby kod był zgodny z wersją PHP <6 , podczas migracji do PHP 6. Nie sądzę, że dotyczy to Pythona.
Znalazłem tę dokumentację na stronie Pythona dotyczącą używania u
znaku w tej samej składni, aby określić ciąg znaków jako Unicode. Niestety nie wspomina o znaku b nigdzie w tym dokumencie.
Poza tym, z ciekawości, czy jest więcej symboli niż b
i u
które robią inne rzeczy?
unicode_literals
z__future__
tego będzie „reverse” zachowanie dla tego konkretnego napisu (w Pythonie 2.x)Python 3.x wyraźnie rozróżnia typy:
str
='...'
literały = sekwencja znaków Unicode (UTF-16 lub UTF-32, w zależności od sposobu kompilacji Pythona)bytes
=b'...'
literały = ciąg oktetów (liczby całkowite od 0 do 255)Jeśli znasz Java lub C #, pomyśl o tym,
str
coString
ibytes
jakbyte[]
. Jeśli znasz SQL, pomyśl o tymstr
jakoNVARCHAR
ibytes
jakoBINARY
lubBLOB
. Jeśli znasz rejestr systemu Windows, pomyśl o tym,str
coREG_SZ
ibytes
jakREG_BINARY
. Jeśli znasz C (++), zapomnij o wszystkim, czego się nauczyłeśchar
i o łańcuchach, ponieważ ZNAK NIE JEST bajtem . Ten pomysł jest dawno przestarzały.Używasz,
str
gdy chcesz reprezentować tekst.Używasz go,
bytes
gdy chcesz reprezentować dane binarne niskiego poziomu, takie jak struktury.Możesz zakodować a
str
dobytes
obiektu.I możesz zdekodować a
bytes
nastr
.Ale nie można swobodnie mieszać tych dwóch rodzajów.
b'...'
Notacja jest nieco mylące w tym, że pozwala bajty 0x01-0x7F być określone za pomocą znaków ASCII zamiast liczb hex.Ale muszę podkreślić, że postać nie jest bajtem .
W Python 2.x
Wersje Pythona w wersjach wcześniejszych niż 3.0 nie zawierały tego rodzaju rozróżnienia między tekstem a danymi binarnymi. Zamiast tego były:
unicode
=u'...'
literały = sekwencja znaków Unicode = 3.xstr
str
='...'
literały = sekwencje pomieszanych bajtów / znakówstruct.pack
wyjściowe.W celu ułatwienia przejścia z wersji 2.x do 3.x
b'...'
literalna składnia została przeniesiona do Pythona 2.6, aby umożliwić odróżnienie ciągów binarnych (które powinny byćbytes
w wersji 3.x) od ciągów tekstowych (które powinny byćstr
w postaci 3 .x).b
Prefiks robi nic 2.x, ale opowiada2to3
scenariusz nie przekonwertować go na ciąg znaków Unicode w 3.x.Tak więc,
b'...'
literały w Pythonie mają ten sam cel, co w PHP.r
Przedrostek tworzy surowy ciąg (npr'\t'
jest odwrotny ukośnik +t
zamiast zakładka) i potrójne cytaty'''...'''
lub"""..."""
pozwalają literały ciągów kilka linii.źródło
'A' == b'A' --> False
Check naprawdę jasno. Reszta jest doskonała, ale do tego momentu nie zrozumiałem poprawnie, że ciąg bajtów nie'שלום עולם' == 'hello world'
B oznacza ciąg bajtów.
Bajty to rzeczywiste dane. Ciągi znaków są abstrakcją.
Jeśli posiadasz wieloznakowy obiekt łańcuchowy i wziąłeś pojedynczy znak, będzie to ciąg znaków, który może mieć rozmiar większy niż 1 bajt, w zależności od kodowania.
Gdyby wziął 1 bajt z łańcuchem bajtów, uzyskałbyś pojedynczą 8-bitową wartość od 0-255 i może nie reprezentować pełnego znaku, jeśli te znaki z powodu kodowania miałyby> 1 bajt.
TBH Użyłbym łańcuchów, chyba że miałbym jakiś konkretny powód niskiego poziomu do używania bajtów.
źródło
Jeśli po stronie serwera wyślemy odpowiedź, zostanie ona wysłana w postaci typu bajtu, więc pojawi się w kliencie jako
b'Response from server'
Aby pozbyć się
b'....'
po prostu użyj poniższego kodu:Plik serwera:
Plik klienta:
to wydrukuje
Response from server
źródło
Oto przykład, w którym brak
b
spowoduje zgłoszenieTypeError
wyjątku w Pythonie 3.xDodanie
b
przedrostka rozwiązałoby problem.źródło
Zmienia to w
bytes
literał (lubstr
w wersji 2.x) i obowiązuje dla wersji 2.6+.r
Przedrostek powoduje backslashe być „zinterpretowaną” (nie ignorowane, a różnica ma znaczenia).źródło
str
obu przypadkach będzie to 2.x, więc można powiedzieć, że jest ignorowane. To rozróżnienie ma znaczenie podczas importowaniaunicode_literals
z__future__
modułu.Oprócz tego, co powiedzieli inni, zauważ, że pojedynczy znak w Unicode może składać się z wielu bajtów .
Sposób działania Unicode polega na tym, że wziął stary format ASCII (7-bitowy kod, który wygląda jak 0xxx xxxx) i dodał sekwencje wielobajtowe , w których wszystkie bajty zaczynają się od 1 (1xxx xxxx), aby reprezentować znaki poza ASCII, aby Unicode był odwrócony -kompatybilny z ASCII.
źródło
Możesz użyć JSON, aby przekonwertować go na słownik
{"kluczowa wartość"}
KOLBA:
To jest przykład z kolby. Uruchom to na linii terminalu:
W kolbie / route.py
{'kluczowa wartość'}
źródło