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 版本中更改的这些小事情的兼容性。
最佳答案
doctests 可能会在 Python 2.x 和 3.x 之间提供不同的输出,正是针对这种情况,但当然其他示例会更改 std-lib API。
正如有人已经在对您的问题的评论中指出的那样,最好的办法是找到方法来生成在 2.x 和 3.x 中保持一致的 doctest 输出。
对于您的特定示例,请记住 Python long
整数的定义取决于体系结构和解释器。一台不错的 128 位 Cray super 计算机会很乐意将 fib(100)
的结果视为一个常规整数。因此,无论您在值的末尾是否得到 L 都比 2.x 与 3.x 更微妙——尽管您在 3.x L中是对的em> 现在从不显示。
关于python - python 2/python 3 的可移植 doctests 是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805434/