2017-03-08 3 views
1

Ich möchte mit python2-3 dieser Code kompatibel machen:Wie Logik machen, basierend auf `unicode` kompatibel mit 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') 

Es gibt keine unicode oder decode auf str Typ in Python 3. Was ist die beste Problemumgehung, um diesen Code python2-3 kompatibel zu machen?

Antwort

1

Ich empfehle dringend die Verwendung von six Bibliothek zum Schreiben von Python 2/3 kompatiblen Code.

Verwenden Sie zusätzlich isinstance() zum Überprüfen des Typs statt type(). type() wird im Falle von Mehrfachvererbung arbeiten:

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'>) 

Andere Ansatz ist im Grunde Ihre eigene Aliase für Kompatibilitäts-Version basierend auf Python zu schreiben, erhalten unter Verwendung sys.version_info:

Ein gutes Beispiel dafür ist compat.py Datei von requests Bibliothek:

_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,) 

Jetzt können Sie diese Funktionen aus dieser Datei importieren, anstatt die Builtins direkt zu verwenden.

Verwandte Themen