【问题标题】:Are portable doctests for python 2 / python 3 possible?python 2 / python 3的便携式文档测试是否可行?
【发布时间】:2013-12-27 17:55:15
【问题描述】:
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 版本中发生变化的小东西兼容。

【问题讨论】:

  • 提示print(9999999999999999999999999L) 输出在两个版本中都没有尾随 L。对于更复杂的情况(例如列表中的长整数等),您最好格式化输出......至于u 和字符串:python3.3 已经不存在了。
  • 这可能对你来说很有趣:pypi.python.org/pypi/doctest-ignore-unicode

标签: python doctest


【解决方案1】:

doctests 可能会在 Python 2.x 和 3.x 之间提供不同的输出,正是针对此类情况,但当然其他示例将更改为 std-lib API。

正如有人已经在您的问题的 cmets 中指出的那样,最好的选择是找到在 2.x 和 3.x 中生成一致的 doctest 输出的方法。

对于您的特定示例,请记住 Python long 整数的定义取决于体系结构和解释器。一台不错的 128 位 Cray 超级计算机会很乐意将 fib(100) 的结果视为常规整数。因此,无论你是否在值的末尾得到一个 L 都比 2.x 与 3.x 更微妙——尽管你在 3.x L 中是对的em> 现在从不显示。

【讨论】:

    猜你喜欢
    • 2016-12-12
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2011-12-09
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多