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版本中已更改的这些小事情的兼容性。
答案 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中是正确的现在永远不会显示。