Является ли six.text_type таким же, как text.decode ('utf8')? - PullRequest
3 голосов
/ 04 октября 2019

При наличии такой функции, как:

import six

def convert_to_unicode(text):
  """Converts `text` to Unicode (if it's not already), assuming utf-8 input."""
  if six.PY3:
    if isinstance(text, str):
      return text
    elif isinstance(text, bytes):
      return text.decode("utf-8", "ignore")
    else:
      raise ValueError("Unsupported string type: %s" % (type(text)))
  elif six.PY2:
    if isinstance(text, str):
      return text.decode("utf-8", "ignore")
    elif isinstance(text, unicode):
      return text
    else:
      raise ValueError("Unsupported string type: %s" % (type(text)))
  else:
    raise ValueError("Not running on Python2 or Python 3?")

Поскольку six поддерживает совместимость с python2 и python3, будет ли указанная выше convert_to_unicode(text) функция эквивалентна просто six.text_type(text)? Т.е.

def convert_to_unicode(text):
    return six.text_type(text)

Есть ли случаи, когда оригинальный convert_to_unicode захватывает, но six.text_type не может?

1 Ответ

3 голосов
/ 04 октября 2019

Поскольку six.text_type является просто ссылкой на тип str или unicode, эквивалентная функция будет такой:

def convert_to_unicode(text):
    return six.text_type(text, encoding='utf8', errors='ignore')

Но в угловых случаях она не ведет себя одинаковонапримерон просто с радостью преобразует целое число, поэтому сначала вам нужно будет поставить несколько проверок.

Кроме того, я не понимаю, почему вы захотите получить errors='ignore'. Вы говорите, что принимаете UTF-8. Но если это предположение нарушается, вы молча удаляете данные. Я настоятельно рекомендую использовать errors='strict'.

EDIT:

Я только что понял, что это не сработает, если text уже то, что вы хотите. Кроме того, он с радостью вызывает ошибку TypeError для любого нестрокового ввода. Так как насчет этого:

def convert_to_unicode(text):
    if isinstance(text, six.text_type):
        return text
    return six.text_type(text, encoding='utf8', errors='ignore')

Единственный раскрытый здесь угловой случай - это версия Python, в которой нет ни 2, ни 3. И я все еще думаю, что вы должны использовать errors='strict'.

...