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
只是对 str
或 unicode
类型的引用,所以等效函数是这样的:
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'
.
给定如下函数:
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
只是对 str
或 unicode
类型的引用,所以等效函数是这样的:
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'
.