给 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 下的适配, 感谢原作者分享。 而消极的人则在每个机会都看到某种忧患。