是否可以进行python 2 / python 3的可移植doctests?

时间:2013-12-27 17:55:16

标签: python doctest

def fib_r(n, memo={0: 0, 1: 1}):
    """recursive fibonacci numbers generation with memoisation

    >>> [fib_r(n) for n in range(10)]
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
    >>> fib_r(100)
    354224848179261915075"""
    if n not in memo:
        memo[n] = fib(n - 1) + fib(n - 2)
    return memo[n]

上面的doctest在python 3上传递,但在2.x上失败,就像这样:

**********************************************************************
File "euler.py", line 93, in __main__.fib
Failed example:
    fib_r(100)
Expected:
    354224848179261915075
Got:
    354224848179261915075L

这只是一个例子,我在其他几种情况下已经看到过这种情况(例如,unicode字符串是否具有u前缀)。我想知道doctest是否有一个选项可以忽略python 2和3之间的微不足道的差异?

我不是在寻找一种解决方法来修改测试本身,以便尽管存在限制,它仍能正常工作。我只是想知道是否有一个标志或某些东西允许一些宽容与python版本中已更改的这些小事情的兼容性。

1 个答案:

答案 0 :(得分:0)

doctests可以在Python 2.x和3.x之间提供不同的输出,完全适用于这种情况,但当然其他示例也会更改std-lib API。

正如有人在您的问题的评论中已经注意到的那样,最好的选择是找到生成在2.x和3.x之间保持一致的doctest输出的方法。

对于您的特定示例,请记住,Python long整数的定义是体系结构和解释器相关的。一个漂亮的128位Cray超级计算机会愉快地将fib(100)的结果视为常规整数。因此,无论你是否在值的末尾得到 L ,都比2.x vs 3.x更微妙 - 尽管你在3.x L中是正确的现在永远不会显示。