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 globs
或 extraglobs
字典:
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)
我写了以下 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 globs
或 extraglobs
字典:
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)