В двух словах, способ обработки текста и данных в Py3k, возможно, может быть самым «прорывным» изменением в языке. Зная и избегая, когда это возможно, ситуации, когда некоторая логика Python 2.6 будет работать иначе, чем в 3.x, мы можем облегчить миграцию, когда это произойдет. Однако следует ожидать, что некоторые части логики 2.6 могут потребовать особого внимания и модификаций, например, для работы с различными кодировками и т. Д.
Идея, лежащая в основе предложения BDFL на слайде 14, заключается в том, чтобы, вероятно, начать " с использованием " тех же типов, которые поддерживает Py3k (и только эти), а именно строки Unicode для строк (тип str
) и 8- битовые байтовые последовательности для «данных» (bytes
тип).
Термин " using " в предыдущем предложении используется довольно свободно, поскольку семантика и связанное хранение / кодирование для этих типов различаются в версиях 2.6 и 3.x. В Python 2.6 тип байтов и связанный литеральный синтаксис (b'xyz ') просто отображаются на тип str. Поэтому
# in Py2.6
>>'mykey' == b'mykey'
True
b'mykey'.__class__
<class 'str'>
# in Py3k
>>>'mykey' == b'mykey'
False
b'mykey'.__class__
<class 'bytes'>
Чтобы ответить на ваш вопрос [в примечаниях ниже], в 2.6, используете ли вы b'xyz 'или' xyz ', Python понимает это как одно и то же: str. Важно то, что вы понимаете их как [потенциально / в будущем] два разных типа с определенной целью :
- str для текстовой информации и
- байтов для последовательностей октетов, хранящих любые данные под рукой.
Например, снова говоря близко к вашему примеру / вопросу, в Py3k вы сможете иметь словарь с двумя элементами, которые имеют одинаковые ключи, один с b'mykey, а другой с mykey, однако в версии 2.6 это невозможно, поскольку эти два ключа действительно одинаковы; важно то, что вы знаете такие вещи и избегаете (или явно помечаете в коде специальным образом) ситуации, когда код 2.6 не будет работать в 3.x.
В Py3k str является абстрактной строкой Unicode, последовательностью кодовых точек (символов) Unicode, и Python имеет дело с преобразованием этого в / из его закодированной формы, какой бы ни была кодировка (как программист, вы действительно говорите о кодирование, но в то время, когда вы имеете дело со строковыми операциями, и вам не нужно беспокоиться об этих деталях). Напротив, байты - это последовательность 8-битных «вещей», семантика и кодирование которых полностью оставлены на усмотрение программиста.
Итак, хотя Python 2.6 не видит разницы, явно используя bytes () / b '...' или str () / u '...', вы ...
- ... подготовьте себя и свою программу к следующим типам и семантике Py3k
- ... упростит автоматическое преобразование (инструмент 2to3 или другой) исходного кода, при этом b в b '...' останется, а u из u '...' будет удалено ( поскольку единственным типом строки будет Unicode).
Для получения дополнительной информации :
Python 2.6 Что нового (см. Литералы PEP 3112 байт)
Python 3.0 Что нового (см. Text Vs. Data Instead Of Unicode Vs. 8-bit
в верхней части)