2016-06-16 4 views
3

Каков наилучший способ сравнить строковый объект с объектом байтов, который работает как на Python 2, так и на Python 3? Предположим, что оба: utf8. В более общем плане, как написать сопоставление Python 2 и Python 3 двух объектов, каждый из которых может быть строкой, байтами или unicode-объектом?Сравнение строки с байтами, которая работает как в Python 2, так и в 3

Проблема заключается в том, что "asdf" == b"asdf" истинна в Python 2 и Ложные в Python 3

Между тем, нельзя слепо кодировать или объекты декодирования, поскольку строки в Python 2 имеют как encode и decode методы, но строки в Python 3 просто используйте методы кодирования.

Наконец, isinstance(obj, bytes) возвращает Справедливо для любого не-юникод строки в Python 2 и возвращает Правда только для байтов объектов в Python 3.

+4

Почему вы сравнивая их в первую очередь? –

+0

@ IgnacioVazquez-Abrams Это не относится к вопросу. Ситуация, в которой я сталкиваюсь, заключается в сравнении вывода библиотеки цифровой подписи с ключом в веб-запросе; один - это строка, а другая - байтовая строка. Однако этот вопрос был попыткой охватить более общую ситуацию, поскольку я не нашел в этом никаких материалов. – Zags

+0

Но это не очень полезно в общей ситуации. Обычно вы должны декодировать байты до текста, прежде чем сравнивать их. –

ответ

5

В обоих Python 2 и Python 3, все, что является экземпляром bytes имеет декодирования. Таким образом, вы можете сделать следующее:

def compare(a, b, encoding="utf8"): 
    if isinstance(a, bytes): 
     a = a.decode(encoding) 
    if isinstance(b, bytes): 
     b = b.decode(encoding) 
    return a == b 
3

Вы можете проверить, является ли вы используете Python 2 или 3, и действовать соответственно:

import sys 

if sys.version_info[0] < 3: 
    text_type = unicode 
else: 
    text_type = str 

if isinstance(obj, text_type): 
    result = obj.encode('utf-8') 
else: 
    result = obj 

 Смежные вопросы

  • Нет связанных вопросов^_^