小能豆

Python 文档测试的多版本支持

py

我正在像这样编写我的文档测试:

>>> 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 版本上会失败。我的问题是如何使其跨版本兼容?


阅读 7

收藏
2024-10-28

共1个答案

小能豆

为了使您的文档测试在 Python 2 和 Python 3 之间兼容,您可以避免使用u''Unicode 字符串的语法,因为在 Python 3 中,Unicode 和字节字符串之间的区别处理方式不同。相反,您可以使用常规字符串文字,它们在 Python 3 中被视为 Unicode,在 Python 2 中被视为字节字符串(如果它们没有以 为前缀u)。

您可以按照以下方法编写文档测试以兼容两个版本:

>>> some_function(a=1, b=2)
{'id': '123', 'name': 'abc'}

这应该在 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

通过这种方法,您的文档测试将保持如下状态:

>>> some_function(a=1, b=2)
{'id': '123', 'name': 'abc'}

并且它们可以在两个 Python 版本中正确地运行。

2024-10-28