字符串在 Python 2.x 和 3.x 下的适配

给 RQ 提交了一个 Pull Request 来解决 issue#437 .

最开始的提交 我做了以下的工作:

找到问题所在写新的单元测试将相关串做 decode 操作跑单元测试通过, 提交 Pull Request

然后….就遇到问题了, Travis 跑完发现 Python2.x 下都没问题, 但是 Python3.x 都跑不过, 原因很简单, python3.x 的时候已经不区分 string 和 unicode, 统一采用 unicode, 因此也取消了 decode 方法. 那么我们如何来同时适配 2.x 和 3.x 版本呢. 我想过很多方法, 但是都觉得不够优雅, 后来还是在 RQ 这个库本身里找到了答案.

在 RQ 中, 对字符串的获取都会经过一个 as_text 的函数处理, 该函数位于 compat/__init__.py, 就是为了同时适配 2.x 和 3.x 版本, 函数如下:

if not PY2:    # Python 3.x and up    text_type = str    string_types = (str,)    def as_text(v):        if v is None:            return None        elif isinstance(v, bytes):            return v.decode('utf-8')        elif isinstance(v, str):            return v        else:            raise ValueError('Unknown type %r' % type(v))    def decode_redis_hash(h):        return dict((as_text(k), h[k]) for k in h)else:    # Python 2.x    text_type = unicode    string_types = (str, unicode)    def as_text(v):        if v is None:            return None        return v.decode('utf-8')    def decode_redis_hash(h):        return h

首先通过 six 这个库来判断 Python 版本, 然后根据版本的不同, 声明 as_text 方法的具体实现, 这样在整个库在处理字符串时, 不需要考虑版本差异, 直接调用 as_text 进行处理即可.

给 RQ 提交了一个 原文地址:字符串在 Python 2.x 和 3.x 下的适配, 感谢原作者分享。 而消极的人则在每个机会都看到某种忧患。

字符串在 Python 2.x 和 3.x 下的适配

相关文章:

你感兴趣的文章:

标签云: