Doctest不承认__future __.师

alv*_*vas 8 python doctest 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
Run Code Online (Sandbox Code Playgroud)

但是当我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.
Run Code Online (Sandbox Code Playgroud)

即使我将未来的import语句转移到第一行:

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
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

为什么会这样,我该如何解决这个问题呢?

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

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

Mar*_*ers 4

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

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

 if __name__ == "__main__":
     import doctest
     import __future__
     doctest.testmod(extraglobs={'division': __future__.division})
Run Code Online (Sandbox Code Playgroud)

然后,当您从这些文件中编译各个行时,它将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)
Run Code Online (Sandbox Code Playgroud)