我在Python 3.9 doctests中遇到一個非常奇怪的單元測驗失敗。 通常情況下,我必須對我的問題進行消毒,但這是相當低級的代碼,所以我可以在這里完整地發布它。
我可以在Pycharm中運行這個測驗,沒有問題。 當我在命令列上運行它時,我得到了一個毫無意義的失敗。 如果有任何幫助,我們將不勝感激。
quadratic_solver.py
import math
import numpy as np
import doctest
def solve()
a: float。
b: float。
c: float)。)
""
:回傳:將二次函式的根排列在一個0-2的浮點數長陣列中
>>> roots = solve(2., -1., 100.) # noRoots
>>> len(roots)
0
>>> roots = solve(1., 2., 1.) # oneRoot
>>> len(roots)
1
>>> round(roots[0], 9)
-1.0
>>> roots = solve(1., 4., 1.) # twoRoots_1
>>> len(roots)
2
>>> round(roots[0], 9)
-3.732050808
>>> round(roots[1], 9)
-0.267949192
>>> roots = solve(-9. , 61. , 19. ) # twoRoots_2
>>> len(roots)
2
>>> round(roots[0], 9)
-0.298343001
>>> round(roots[1], 9)
7.076120779
"""
# https://math.stackexchange.com/questions/866331/numerically-stable-algorithm-for-solving-the-quadratic-equation-when-a-is-very
desc = b**2 - 4. * a * c
if desc < 0.:
# no roots.
return np.array([] )
elif desc == 0.:
# one root.
root = -b / (2. * a)
return np.array([root])
else:
d = math.sqrt(b**2 - 4. * a * c)
root1 = (-b d) / (2. * a)
root2 = (-b - d) / (2. * a)
if root1 < root2:
return np.array([root1, root2])
else:
return np.array([root2, root1])
doctest.testmod()
運行python -m doctest $PATH_TO_FILE$/quadratic_solver.py時的錯誤資訊:
**********************************************************************
檔案 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/doctest.py", line 1820, in __main__.DebugRunner
失敗的例子。
runner.run(test)
預期的。
回溯(最近一次呼叫)。
...
doctest.UnexpectedException: <DocTest foo from foo.py:0 (2 examples)>
得到了。
回溯(最近一次呼叫)。
檔案 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/doctest.py", line 1336, in __run
exec(compile(example.source, filename, "single" /span>,
檔案 "<doctest __main__.DebugRunner[15]>", 行 1, in < module>
runner.run(test)
檔案 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/doctest.py", line 1844, in run
r = DocTestRunner.run(self, test, compileflags, out, False)
檔案 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/doctest.py", 行 1483, 在運行
return self.__run(test, compileflags, out)
檔案 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/doctest.py", line 1388, in __run
self.report_unexpected_exception(out, test, example,
檔案 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/doctest.py", line 1850, in report_unexpected_exception
raise UnexpectedException(test, example, exc_info)
UnexpectedException: <DocTest foo from foo.py:0(2 examples)>
**********************************************************************
uj5u.com熱心網友回復:
這里的問題是doctest.testmod()一行。
PyCharm只是檢測Python模塊中是否有測驗,并使用它自己的測驗運行器運行它們,所以它只是忽略了這一行。
如果你從命令列中呼叫 doctester,它的做法基本相同:它檢測所有的 doctests 并運行它們,但此外,它還試圖對 doctest 的執行行進行檢測。如果你使用verbose輸出,你可以看到這一點:
python -m doctest -v $PATH_TO_FILE$/quadratic_solver.py
這表明所有的doctest都被正確地運行,之后doctest中的測驗被執行。在doctest中的一個類(即DebugRunner)本身有一個doctest失敗了(不確定這是否是一個bug,或者只是不打算以這種方式運行)。
其原因是,如果通過一個庫(使用 if __name__ == "__main__")呼叫,在這種情況下,你沒有保護測驗器的代碼不被執行。
所以要解決這個問題,你有兩種可能:
- 洗掉在 "我 "和 "我 "之間的那一行。
- 洗掉呼叫 doctests 的那一行;這將使它在命令列上與 doctest 一起作業
- 使用:
- 使用:
if __name__ == "__main__"/span>:
doctest.testmod()
這將使它在通過doctest呼叫時都能正常作業:
python -m doctest $PATH_TO_FILE$/quadratic_solver.py
而只是執行模塊中的doctest行的呼叫:
python $PATH_TO_FILE$/quadratic_solver.py
注意,第二種變體也可以在你目前的代碼中作業,但這也意味著,當你從其他地方匯入庫時,都會執行測驗,這當然不是你想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328081.html
標籤:
