我有时会遇到以下问题。我有一个函数,它返回我感兴趣的内容并打印我不关心的内容。例如。
def f(x):
print('Some complicated printing stuff')
important_result = 42
return important_result
我想编写一个文档测试,它检查它是否确实返回了正确的结果。但其代码不会被复杂的打印内容所混淆。 以下内容会很酷:
def f(x):
"""
>>> f(0)
...
42
"""
print('Some complicated printing stuff')
important_result = 42
return important_result
有没有一种优雅的方式来完成这个?
鉴于此,您的问题有标签“doctest” - 我假设您想为您的函数运行 doctest (在评论部分中启发我,以了解任何假设或琐事) - 因为文本不明确。
doctest
基本上通过以 Python 交互式会话 的形式查找文本来工作。该文本可以写入 docstring
(就像在第二个代码块/示例中一样)或单独的文件中。
要运行文档测试,首先指定以下代码(对于您提到的代码示例,您只需键入确切的行):
if __name__ = "__main__":
import doctest
doctest.testmod()
doctest
模块。 将上述代码包含在模块(*.py 文件)中后,只需作为脚本运行即可:
python yourmodule.py
或者, 可以直接运行doctest(不需要上面3行代码):
pyhton -m doctest yourmodule.py
使用单独的文件 - 在文件中添加以下行:
if __name__ = "__main__"
import doctest
doctest.testfile("somefile.txt")
它将识别并执行文件中的任何交互式 Python 文本。默认情况下,
testfile()
将在模块(.py文件)所在的同一目录中查找“somefile.txt”(使用我们可以在其他位置查找文件的选项)。
回到你的问题
我想写一个
,它检查它确实返回 正确的结果。但谁的代码不被复杂所混淆 印刷的东西。以下内容会很酷:doctest
NO(直接不可能) -
doctest
的场景是通过在 docstring
中以 Python 交互式会话的形式指定示例来设置/编写的 - 正是如上所述,一个好的实践是使用各种在交互式会话中输入并将这些行复制粘贴到 docstring
中 - 所有 print
语句肯定会在那里,并且是 doctest 的一部分将测试标记为通过。
间接方式s:
printing
- 开销是您需要对函数进行更改,即将 print
语句移到 if
下。
def f(x, printing=True):
"""
f(0, printing=False)
...
42
"""
if printing:
print('Some complicated printing stuff')
important_result = 42
return important_result
None
参数传递给 print
函数 - 请注意,它将传递给模块中的所有打印调用,即整个 *.py
文件。
def f(x):
"""
f(0)
...
42
"""
print('Some complicated printing stuff')
important_result = 42
return important_result
if name == 'main':
import doctest
print = lambda *args, **kwargs: None
doctest.testmod()
来源:jonrsharpe的回答
为了获得一些反馈,我最终打印了 doctest.testmod() 的结果
一种选择是打印到 stderr 而不是 stdout 例如
print('Some complicated printing stuff', file=sys.stderr)
打印到stderr不会被doctest检查