Как определить двоичную строку в Python таким образом, который работает как с py2 и py3? - PullRequest
7 голосов
/ 13 октября 2011

Я пишу модуль, который должен работать как в Python 2, так и в 3, и мне нужно определить двоичную строку.

Обычно это будет что-то вроде data = b'abc', но этот код не работает на Python2.5 с неверным синтаксисом.

Как я могу написать приведенный выше код таким образом, чтобы он работал во всех версиях Python 2.5 +

Примечание: это должно быть binary (оно может содержатьлюбые символы, 0xFF), это очень важно.

Ответы [ 3 ]

6 голосов
/ 14 октября 2011

Я бы порекомендовал следующее:

from six import b

Для этого требуется шесть модулей , конечно. Если вы не хотите этого, вот другая версия:

import sys
if sys.version < '3':
    def b(x):
        return x
else:
    import codecs
    def b(x):
        return codecs.latin_1_encode(x)[0]

Подробнее .

Эти решения (по сути, одинаковые) работают, являются чистыми, настолько быстрыми, насколько вы собираетесь, и могут поддерживать все 256-байтовые значения (что не может сделать ни одно из других решений здесь).

2 голосов
/ 13 октября 2011

Если строка содержит только символы ASCII, вызовите encode.Это даст вам str в Python 2 (точно так же как b'abc') и bytes в Python 3:

'abc'.encode('ascii')

Если нет, вместо того, чтобы помещать двоичные данные в источник, создайтефайл данных, откройте его с помощью 'rb' и прочитайте из него.

0 голосов
/ 13 октября 2011

Вы можете хранить данные в кодировке base64.

Первым шагом будет преобразование в base64:

>>> import base64
>>> base64.b64encode(b"\x80\xFF")
b'gP8='

Это нужно сделать один раз, используя b илине зависит от версии Python, которую вы используете для него.

На втором шаге вы помещаете эту строку байтов в программу без b.Затем гарантируется, что он работает в py2 и py3.

import base64
x = 'gP8='
base64.b64decode(x.encode("latin1"))

дает вам str '\x80\xff' в 2.6 (также должно работать в 2.5) и b'\x80\xff' в 3.x.

В качестве альтернативы двум вышеописанным шагам вы можете сделать то же самое с шестнадцатеричными данными, вы можете сделать

import binascii
x = '80FF'
binascii.unhexlify(x) # `bytes()` in 3.x, `str()` in 2.x
...