Python2&3 : 比较 str 和 unicode
Python2&3 : compare str and unicode
我正在为一个试图保持相同代码的项目而苦苦挣扎 运行 Python2.6、Python 2.7 和 Python 3.x.
此项目使用 python_2_unicode_compatible class decorator 以 str 类型存储非 unicode 值。
我必须测试函数 foo 返回 str 类型(不是 unicode一);返回值用非ascii字符填充。
我只想根据我自己的字符串测试此函数返回的值,例如:
from __future__ import unicode_literals # so that "àbcéfg" will be read u"àbcéfg"
bool_test = (foo() == "àbcéfg")
我卡住了,因为“àbcéfg”在 Python2 中将被视为 unicode 字符串,在 Python3 中将被视为 str 字符串.
例如,对于 Python2,此代码会引发以下错误:
Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
是否有一种独特的方式来实现比较,对于 Python2 和 Python3 是通用的?
我尝试了几种解决方案(例如将 str 转换为字节),但都没有成功。
有什么想法可以帮助我吗?
您比较的是正确的,但是 foo()
不是 return Unicode 值。它是 return 在 Python 2:
中的一个字节串
>>> def foo():
... return u"àbcéfg".encode('utf8')
...
>>> foo() == u"àbcéfg"
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
要么修复 foo()
,要么将其传递给一个函数,该函数将解码 return 值(如果不是 Unicode 值)(此处使用 six
module 桥接 Python 2 和 3):
import six
def ensure_unicode(value, encoding='utf8'):
if isinstance(value, six.binary_type):
return value.decode(encoding)
return value
bool_test = ensure_unicode(foo()) == "àbcéfg"
如果 foo()
意味着 return Python 2 中的一个字节串,以及 Python 3 中的一个 Unicode 字符串,那么以上将继续工作但不是具体在 Python 2 中验证它是正确的类型;您可以为此添加一个单独的 isinstance()
测试:
foo_result = foo()
bool_test = isinstance(foo_result, str) and ensure_unicode(foo_result) == "àbcéfg"
我正在为一个试图保持相同代码的项目而苦苦挣扎 运行 Python2.6、Python 2.7 和 Python 3.x.
此项目使用 python_2_unicode_compatible class decorator 以 str 类型存储非 unicode 值。
我必须测试函数 foo 返回 str 类型(不是 unicode一);返回值用非ascii字符填充。
我只想根据我自己的字符串测试此函数返回的值,例如:
from __future__ import unicode_literals # so that "àbcéfg" will be read u"àbcéfg"
bool_test = (foo() == "àbcéfg")
我卡住了,因为“àbcéfg”在 Python2 中将被视为 unicode 字符串,在 Python3 中将被视为 str 字符串.
例如,对于 Python2,此代码会引发以下错误:
Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
是否有一种独特的方式来实现比较,对于 Python2 和 Python3 是通用的?
我尝试了几种解决方案(例如将 str 转换为字节),但都没有成功。
有什么想法可以帮助我吗?
您比较的是正确的,但是 foo()
不是 return Unicode 值。它是 return 在 Python 2:
>>> def foo():
... return u"àbcéfg".encode('utf8')
...
>>> foo() == u"àbcéfg"
__main__:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
False
要么修复 foo()
,要么将其传递给一个函数,该函数将解码 return 值(如果不是 Unicode 值)(此处使用 six
module 桥接 Python 2 和 3):
import six
def ensure_unicode(value, encoding='utf8'):
if isinstance(value, six.binary_type):
return value.decode(encoding)
return value
bool_test = ensure_unicode(foo()) == "àbcéfg"
如果 foo()
意味着 return Python 2 中的一个字节串,以及 Python 3 中的一个 Unicode 字符串,那么以上将继续工作但不是具体在 Python 2 中验证它是正确的类型;您可以为此添加一个单独的 isinstance()
测试:
foo_result = foo()
bool_test = isinstance(foo_result, str) and ensure_unicode(foo_result) == "àbcéfg"