
- Encode obj.__repr__() to bytestring if its type is unicode in Python 2. - Add internal encode_to_utf8() decorator. - Do not raise an exception if a class does not have an __str__() method, just warn.
33 lines
968 B
Python
33 lines
968 B
Python
import functools
|
|
import warnings
|
|
|
|
import six
|
|
|
|
if six.PY3:
|
|
from email.mime.text import MIMEText
|
|
else:
|
|
from email.MIMEText import MIMEText
|
|
|
|
|
|
def encode_to_utf8(method):
|
|
def wrapper(self):
|
|
if six.PY2 and isinstance(method(self), six.text_type):
|
|
return method(self).encode('utf-8')
|
|
return method(self)
|
|
functools.update_wrapper(wrapper, method, ['__name__', '__doc__'])
|
|
return wrapper
|
|
|
|
|
|
# based on django.utils.encoding.python_2_unicode_compatible
|
|
def py2_unicode(klass):
|
|
if six.PY2:
|
|
if '__str__' not in klass.__dict__:
|
|
warnings.warn("@py2_unicode cannot be applied "
|
|
"to %s because it doesn't define __str__()." %
|
|
klass.__name__)
|
|
klass.__unicode__ = klass.__str__
|
|
klass.__str__ = encode_to_utf8(klass.__unicode__)
|
|
if '__repr__' in klass.__dict__:
|
|
klass.__repr__ = encode_to_utf8(klass.__repr__)
|
|
return klass
|