我正在像这样编写我的文档测试:
>>> some_function(a=1, b=2) {u'id': u'123', u'name': u'abc'}
这对于 Python 2.5、2.6 和 2.7 版本运行良好,但对于 Python 3 则失败,并出现以下错误:
Expected: {u'id': u'123', u'name': u'abc'} Got: {'id': '123', 'name': 'abc'}
问题是,如果我像这样编写文档测试:
>>> some_function(a=1, b=2) {'id': '123', 'name': 'abc'}
它们仅适用于 Python3,在 Python2 版本上会失败。我的问题是如何使其跨版本兼容?
为了使您的文档测试在 Python 2 和 Python 3 之间兼容,您可以避免使用u''Unicode 字符串的语法,因为在 Python 3 中,Unicode 和字节字符串之间的区别处理方式不同。相反,您可以使用常规字符串文字,它们在 Python 3 中被视为 Unicode,在 Python 2 中被视为字节字符串(如果它们没有以 为前缀u)。
u''
u
您可以按照以下方法编写文档测试以兼容两个版本:
这应该在 Python 2(将它们解释为字节字符串)和 Python 3(它们是 Unicode 字符串)中都有效。
如果要确保输出在 Python 2 中明确为 Unicode,则可以在返回输出之前将其转换为 Unicode。这样,您既可以保持兼容性,又可以确保在两个版本中返回正确的类型。
例如,你可以修改函数以在 Python 2 中返回 Unicode 字符串,同时在 Python 3 中仍返回常规字符串:
def some_function(a, b): result = {'id': '123', 'name': 'abc'} # Convert to Unicode in Python 2 if sys.version_info[0] < 3: result = {k: unicode(v) for k, v in result.items()} return result
通过这种方法,您的文档测试将保持如下状态:
并且它们可以在两个 Python 版本中正确地运行。