Pythonic方法确保python 2和3中的unicode

Pac*_*ace 8 python python-2.x python-3.x

我正在移植一个库,以便它兼容python 2和3.库从调用应用程序接收字符串或类似字符串的对象,我需要确保这些对象转换为unicode字符串.

在python 2中,我可以这样做:

unicode_x = unicode(x)
Run Code Online (Sandbox Code Playgroud)

在python 3中,我可以这样做:

unicode_x = str(x)
Run Code Online (Sandbox Code Playgroud)

但是,我拥有的最佳跨版本解决方案是:

def ensure_unicode(x):
  if sys.version_info < (3, 0):
    return unicode(x)
  return str(x)
Run Code Online (Sandbox Code Playgroud)

这肯定不是很好(虽然它的工作原理).有更好的解决方案吗?

我知道unicode_literalsu前缀,但这两个解决方案不起作用,因为输入来自客户端,而不是我的库中的文字.

Mar*_*ers 11

不要重新发明兼容性层轮.使用six兼容层,这是一个小型单文件项目,可以包含在您自己的项目中:

Six支持自2.6以来的每个Python版本.它只包含在一个Python文件中,因此可以轻松地复制到项目中.(必须保留版权和许可声明.)

它包含一个six.text_type()可执行的调用,将值转换为Unicode文本:

import six

unicode_x = six.text_type(x)
Run Code Online (Sandbox Code Playgroud)

项目源代码中,这被定义为:

import sys

PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3
# ...

if PY3:
    # ...
    text_type = str
    # ...

else:
    # ...
    text_type = unicode
    # ...
Run Code Online (Sandbox Code Playgroud)