six.text_type 和 text.decode('utf8') 一样吗?

Is six.text_type the same as text.decode('utf8')?

给定如下函数:

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 不能捕获的情况?

因为 six.text_type 只是对 strunicode 类型的引用,所以等效函数是这样的:

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

但它在极端情况下的表现并不相同,例如。它会愉快地转换一个整数,所以你必须先在那里做一些检查。

另外,我不明白你为什么想要 errors='ignore'。 你说你假设UTF-8。 但是如果违反了这个假设,你就是在悄悄地删除数据。 我强烈建议使用 errors='strict'.

编辑:

我刚刚意识到,如果 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'.