Doctest 无法识别 __future__.division

Doctest not recognizing __future__.division

我写了以下 doctest x.doctest:

This is something:

    >>> x = 3 + 4

foo bar something else:

    >>> from __future__ import division
    >>> y = 15
    >>> z = int('24')
    >>> m = z / y
    >>> print (m)
    1.6

但是当我 运行 python -m doctest x.doctest 在 python 2.7.11 上时,doctest 没有识别 from __future__ import division:

**********************************************************************
File "x.doctest", line 11, in x.doctest
Failed example:
    print (m)
Expected:
    1.6
Got:
    1
**********************************************************************
1 items had failures:
   1 of   6 in x.doctest
***Test Failed*** 1 failures.

即使我将未来的导入语句移到第一行:

This is something:

    >>> from __future__ import division
    >>> x = 3 + 4

foo bar something else:

    >>> y = 15
    >>> z = int('24')
    >>> m = z / y
    >>> print (m)
    1.6

doctest 仍然失败:

**********************************************************************
File "x.doctest", line 11, in x.doctest
Failed example:
    print (m)
Expected:
    1.6
Got:
    1
**********************************************************************
1 items had failures:
   1 of   6 in x.doctest
***Test Failed*** 1 failures.

为什么会这样,我该如何解决?

是否有 doctest 的标志/选项要求确保 from __future__ import division 被识别?

注意:我可以强制检查 print (int(m))y = 15. 并且 doctest 将通过,但这不是那么可取。

您可以为 Python 解释器使用选项 -Q。将其设置为 new

python -Qnew -m doctest x.doctest

获取有关 Python 命令行选项的帮助:

python -h

选定的输出:

-Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew

更多帮助详情here

Doctests 运行 每行 隔离 通过 Python 编译器。这意味着在 doctest 本身 中用 from __future__ import .. 语句 指定的任何编译器标志在 doctest 中都是无用的。

但是,您可以将来自真实 __future__ module 的名称添加到您的 doctest 全局变量中。如果你 使用 from __future__ import <name> 格式而是使用 import __future__ ,你导入那个实际的模块,并且可以添加对它定义的对象的引用到 doctest globsextraglobs 字典:

 if __name__ == "__main__":
     import doctest
     import __future__
     doctest.testmod(extraglobs={'division': __future__.division})

然后 DocTestRunner 会在从这些文件编译单独的行时为您设置正确的编译器标志。

演示:

>>> import doctest
>>> import __future__
>>> import sys
>>> def foo():
...     """
...     >>> 1 / 2
...     0.5
...     """
...
>>> doctest.testmod(sys.modules['__main__'])
**********************************************************************
File "__main__", line 3, in __main__.foo
Failed example:
    1 / 2
Expected:
    0.5
Got:
    0
**********************************************************************
1 items had failures:
   1 of   1 in __main__.foo
***Test Failed*** 1 failures.
TestResults(failed=1, attempted=1)
>>> doctest.testmod(sys.modules['__main__'], extraglobs={'division': __future__.division})
TestResults(failed=0, attempted=1)