Що означає префікс ab перед рядком python?


107

У вихідному коді python я натрапив на те, що я бачив невеликий b перед рядком, як у:

b"abcdef"

Я знаю про uпрефікс, що позначає рядок unicode, і rпрефікс для необмеженого літерального рядка.

Що робить bстенд для і в якому - то вихідний код корисним , як це , здається, так само , як простий рядки без якого - або префікса?


10
@SLott: перейдіть за поданим вами посиланням, ви побачите, що префікс b не дозволений у рядковому префіксі ... для 2.6 (виглядає як незначна помилка в матеріалі посилання). І гуглити з приводу таких речей непросто. Я спробував такі ключові слова, як "префікс рядка b python", і в основному ніде не потрапив.
kriss

У використаному посиланні S.Lott відсутній специфікатор версії; мова йде про Python 3: docs.python.org/3/reference/… . Префікс тепер також підтримується в Python 2.6 і вище, щоб полегшити перехресну версію коду Python.
Martijn Pieters

1
це запитання не є ні "точним дублікатом", ні відповіддю на запитання "Чи можу я позбутися цього символу" b "у своїй друкованій заяві?" stackoverflow.com/questions/42599851/… Ви б не заперечували, щоб відмітити це, будь ласка, марихін? людина, яка запитала, а також особа, яка насправді намагалася відповісти, може оцінити можливість відповісти на поставлене фактичне запитання.
мені_

Відповіді:


62

Це Python3 bytes буквально . Цей префікс відсутній у Python 2.5 та пізніших версіях (він еквівалентний простому рядку розміром 2.x, тоді як звичайний рядок розміром 3.x еквівалентний літералу з uпрефіксом у 2.x). В Python 2.6+ це еквівалентно простий рядки, для сумісності з 3.x .


@WRAR: Був у коді python 2.6. Я бачив це, схоже, це було введено в python2.6
kriss

Я спеціально перевірив це у посиланні 2.6 перед публікацією: docs.python.org/reference/lexical_analysis.html#literals
wRAR

1
Добре, "Для майбутньої сумісності Python 2.6 додає байти як синонім типу str, і він також підтримує b '' позначення.", З пункту "Що нового".
WRAR

так як вищезазначені посилання тепер вказують на 2,7 посилання та додано префікс b, ось посилання на стару фіктивну посилання docs.python.org/release/2.6.8/reference/…
kriss

98

bПрефікс позначає bytesстроковий літерал .

Якщо ви бачите, що він використовується у вихідному коді Python 3, вираз створює bytesоб'єкт , а не звичайний об’єкт Unicodestr . Якщо ви бачите, що це лунає у вашій оболонці Python або як частина списку, дикту або іншого вмісту контейнера, ви бачите bytesоб’єкт, представлений за допомогою цієї позначення.

bytesОб'єкти в основному містять послідовність цілих чисел у діапазоні 0-255, але при їх представленні Python відображає ці байти як точки коду ASCII, щоб полегшити зчитування їх вмісту. Будь-які байти за межами друку діапазону ASCII символів відображаються в вигляді керуючих послідовностей (наприклад \n, \x82і т.д.). І навпаки, ви можете використовувати як символи ASCII, так і послідовності виходу для визначення значень байтів; для значень ASCII використовується їх числове значення (наприклад, b'A'== b'\x41')

Оскільки bytesоб'єкт складається з послідовності цілих чисел, ви можете побудувати bytesоб'єкт з будь-якої іншої послідовності цілих чисел зі значеннями в діапазоні 0-255, як список:

bytes([72, 101, 108, 108, 111])

і індексація дає вам назад цілі числа (але нарізка виробляє нове bytesзначення, для наведеного вище прикладу, value[0]дає вам 72, але value[:1]це , b'H'як 72 є точкою ASCII код букви H ).

bytesмодель двійкових даних , включаючи закодований текст . Якщо ваше bytesзначення містить текст, вам потрібно спершу розшифрувати його, використовуючи правильний кодек. Якщо, наприклад, дані кодуються як UTF-8, ви можете отримати strзначення Unicode за допомогою:

strvalue = bytesvalue.decode('utf-8')

І навпаки, щоб перейти від тексту в strоб'єкті до bytesвас потрібно кодувати . Вам потрібно визначитися з кодуванням; за замовчуванням - використовувати UTF-8, але те, що вам знадобиться, сильно залежить від вашого випадку використання:

bytesvalue = strvalue.encode('utf-8')

Ви можете також використовувати конструктор, bytes(strvalue, encoding)щоб зробити те ж саме.

Як методи декодування, так і кодування беруть додатковий аргумент, щоб вказати, як слід обробляти помилки .

Python 2, версії 2.6 та 2.7 також підтримують створення рядкових літералів, використовуючи b'..'синтаксис рядкових літералів , щоб полегшити код, який працює і на Python 2 і 3.

bytesоб'єкти незмінні, як і strрядки. Використовуйте bytearray()об'єкт, якщо вам потрібно мати значення змінних байтів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.