Если ваш код должен быть совместим с и Python 2 и Python 3, вы не можете напрямую использовать такие вещи, как isinstance(s,bytes)
или isinstance(s,unicode)
, не заключая их в try / исключением или Python проверка версии, потому что bytes
не определено в Python 2, а unicode
не определено в Python 3.
Есть несколько уродливых обходных путей. Чрезвычайно уродливо сравнивать имя типа, а не сравнивать сам тип. Вот пример:
# convert bytes (python 3) or unicode (python 2) to str
if str(type(s)) == "<class 'bytes'>":
# only possible in Python 3
s = s.decode('ascii') # or s = str(s)[2:-1]
elif str(type(s)) == "<type 'unicode'>":
# only possible in Python 2
s = str(s)
Возможно, немного менее уродливый обходной путь - проверить номер версии Python, например ::
if sys.version_info >= (3,0,0):
# for Python 3
if isinstance(s, bytes):
s = s.decode('ascii') # or s = str(s)[2:-1]
else:
# for Python 2
if isinstance(s, unicode):
s = str(s)
Они оба непифоничны, и в большинстве случаев, вероятно, есть лучший способ.