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

标签 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 版本中更改的这些小事情的兼容性。

最佳答案

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 现在从不显示。

关于python - python 2/python 3 的可移植 doctests 是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20805434/

相关文章:

testing - 有没有类似于 Python 的 Doctest 的 Matlab 工具?

python - 如何将 doctests 与 unittest 的测试发现相结合?

python-2.7 - 如何使 pytest 触发的 doctests 忽略字符串的 unicode 前缀 `u' .. .'`?

python - 如何使用 HTTP 500 响应 Falcon 框架中任何未处理的异常

python - 在 numpy 数组中找到一些缺失点

python - 无法在通过python建立的tcp套接字上使用原始数据包处理mysql登录?可能是因为盐的原因?

python - 添加从浏览器启动命令的可能性

c# - 从 Python 转换为 C#

python - 如何在 Python 提示符下启用 'doctest.ELLIPSIS'?

python - 如何让 pytest 运行 doctests 以及正常的测试目录?