Байты всегда октеты в Python?


Может ли существовать реализация Python, в которой утверждение не выполняется:

assert all(byte in range(256) for byte in any_bytes_object) # Python 3 semantics 
assert all(byte in range(256) for byte in map(ord, any_bytes_object)) # Python 2

POSIX явно указывает, что CHAR_BIT == 8 (8 бит на байт). Есть ли подобная гарантия в Python? Это где-то задокументировано?

Ссылка на Python 2 гласит: " символы представляют собой (по крайней мере) 8-битные байты."

Если bytes имя не определено (на старых версиях Python), например, на Jython 2.5, то вопрос заключается в str типе (bytestrings), т. е. bytes = str на Питон 2.

3 2

3 ответа:

Объект bytes Python 3 документация говорит

Байтовые объекты на самом деле ведут себя как неизменяемые последовательности целых чисел, причем каждое значение в последовательности ограничено таким образом, что 0

И тип bytearray задокументирован как в Python 3, так и в Python 2 как

Изменяемая последовательность целых чисел в диапазоне 0

Таким образом, язык разработан в предположении о 8-битном байты.


Раздел модели данных Python 2, говорящий "по крайней мере" 8 бит, кажется, просто является одним из мест, где документация Python 2 не была обновлена очень хорошо по сравнению с документацией Python 3. Он восходит, по крайней мере, к Python 1.4, еще в очень ранние дни, когда они не были уверены, хотят ли они поддерживать странные размеры байтов.

С момента, по крайней мере, введения поддержки unicode в версии 2.0, документация была полной мест, относящихся к типу bytestring как "8-битные строки". Python не так строго определен, как что-то вроде C, но я бы сказал, что любая "соответствующая" реализация Python 2.0 или выше должна иметь 8-битные байты.

В дополнение к официальной документации , цитируемой user2357112, мы можем ознакомиться с предложениями по улучшению Python, которые ввели объект bytes.

PEP 358 -- объект" bytes " указан:

Объект bytes хранит изменяемую последовательность целых чисел, находящихся в диапазоне от 0 до 255.

Как мы знаем, объекты bytes оказались неизменяемыми, эта спецификация не может быть полностью применима и "диапазон" ее часть Может быть спорным, слишком.

Интересно, что PEP 3137 -- неизменяемые байты и изменяемый буфер , который частично заменил PEP 358 (и определяет байты как неизменяемые и вводит bytearrays как изменяемый эквивалент), указывает только то, что вы можете поместить в байтовые объекты и в bytearrays ("int[eger]s в диапазоне(256)"), но не то, что может выходите из них.

Ни один PEP не упоминает "бит" или " бит " вообще. (Хотя мы знаем, что от побитовых булевых операций, как целые числа Python сопоставляются с битовыми шаблонами, так что там не должно быть никаких сюрпризов, я надеюсь.)

Python 3

Начиная с Python 3.0 , ссылка на язык Python определяет:

Объект bytes - это неизменяемый массив. Элементы представляют собой 8-битные байты, представленные целыми числами в диапазоне 0

Python 2

До этого (т. е. до Python 2.7) он указывал (как уже упоминалось в вопросе):

Элементы строки являются символами. [ ... ] Символы представляют собой (по крайней мере) 8-битные байты.

(Курсив мой.)

Обратите внимание, что Python 2 не имел объекта bytes. Для хранения неизменяемых последовательностей двоичных данных с байтовыми фрагментами в Python 2 обычно используются строки. (Строки Python 3, напротив, предназначены только для текстовых данных и более эквивалентны объектам Python 2 unicode, чем строкам Python 2.)

Но ...

Python 2 документация ord() Функция упоминает "8-битные строки" и сравнивает их с объектами unicode. Можно было бы предположить, что все строки Python-2, отличные от unicode, являются 8-битными строками, но я бы на это не рассчитывал.

Заключение

Реализация Python, предоставляющая Python-3-совместимые объекты bytes, будет ограничена только 8-битными байтами в них. Реализация Python, совместимая с Python 2, не будет связана этим (поскольку объект bytes, если он содержит один, будет не определен), и если вы используете его строки, совместимые с Python-2, в качестве замены, не будет никаких гарантий о максимальном размере байта (на самом деле, размер символа), либо, если реализация не заявляет о каких-то собственных гарантиях.