1

I want to make this code compatible with python2-3 :

def normalize_text(text, ignore_characters=''):
    if type(ignore_characters) not in [list, str, unicode]:
        ignore_characters = ''
    if type(ignore_characters) == str:
        ignore_characters = ignore_characters.decode('utf-8')
    if type(ignore_characters) == list:
        new_ignore_characters = []
        for item in ignore_characters:
            if type(item) == str:
                new_ignore_characters.append(item.decode('utf-8'))
            elif type(item) == unicode:
                new_ignore_characters.append(item)
        ignore_characters = new_ignore_characters

    if type(text) == str:
        text = text.decode('utf-8')

There is no unicode or decode on str type in python 3. What is the best workaround to make this code python2-3 compatible?

Ashwini Chaudhary
  • 244,495
  • 58
  • 464
  • 504
Pooya
  • 992
  • 2
  • 10
  • 31

1 Answers1

2

I highly recommend using six library for writing Python 2/3 compatible code.

Plus use isinstance() for checking type instead of type(). type() won't work in case of multiple-inheritance:

from six import text_type, binary_type

if isinstance(ignore_characters, binary_type):
   # do something with bytes
elif isinstance(ignore_characters, text_type):
   # do something with unicode.

# Python 2 
>>> import six
>>> six.binary_type, six.text_type
(<type 'str'>, <type 'unicode'>)

# Python 3
>>> import six
>>> six.binary_type, six.text_type
(<class 'bytes'>, <class 'str'>)

Other approach is to basically write your own aliases for compatibility based on Python version obtained using sys.version_info:

A good example of this is compat.py file from requests library:

_ver = sys.version_info

#: Python 2.x?
is_py2 = (_ver[0] == 2)

#: Python 3.x?
is_py3 = (_ver[0] == 3)

if is_py2:
    builtin_str = str
    bytes = str
    str = unicode
    basestring = basestring
    numeric_types = (int, long, float)
    integer_types = (int, long)

elif is_py3:
    builtin_str = str
    str = str
    bytes = bytes
    basestring = (str, bytes)
    numeric_types = (int, float)
    integer_types = (int,)

Now you can import these functions from this file instead of using the builtins directly.

Ashwini Chaudhary
  • 244,495
  • 58
  • 464
  • 504