If you define a custom __str__ method for any of your classes, functions like print() expect __str__ on Py2 to return a byte string, whereas on Py3 they expect a (unicode) string.
Use the following decorator to map the __str__ to __unicode__ on Py2 and define __str__ to encode it as utf-8:
from future.utils import python_2_unicode_compatible
@python_2_unicode_compatible
class MyClass(object):
def __str__(self):
return u'Unicode string: \u5b54\u5b50'
a = MyClass()
# This then prints the name of a Chinese philosopher:
print(a)
This decorator is identical to the decorator of the same name in django.utils.encoding.
This decorator is a no-op on Python 3.