Этот вопрос поразительно похож на этот, однако предложение в комментариях не работает (больше?), как показано ниже.
Я пытаюсь написать пакет, совместимый с python2-3, и в одном из моих методов есть генератор классов, а type()
вызывает у меня проблемы в тестах python-2.7:
Python 2.7.13 (default, Mar 18 2017, 17:03:32)
[GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import unicode_literals
>>> from builtins import str
>>> type('MyClass', (object,), {})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type() argument 1 must be string, not unicode
>>> type(str('MyClass'), (object,), {})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type() argument 1 must be string, not newstr
На странице обзора Python-Future говорится:
# Compatible output from isinstance() across Py2/3:
assert isinstance(2**64, int) # long integers
assert isinstance(u'blah', str)
assert isinstance('blah', str) # only if unicode_literals is in effect
Я ожидал, что это даст мне последовательное поведение везде, где требуются строки, но, по-видимому, нет.
Каков правильный, независимый от версии способ сделать это? Другой вопрос, на который я ссылался, был задан в эпоху python-2.6, и похоже, что с тех пор поведение изменилось. Я не думаю, что могу просто сбросить unicode_literals, так как я сталкиваюсь с проблемами переносимости (в другом месте) с вызовами hashlib, если у меня его нет.