我有时会遇到以下问题。我有一个函数,它返回我感兴趣的东西并打印一些我不关心的东西。例如。
def f(x):
print('Some complicated printing stuff')
important_result = 42
return important_result
我想写一个doctest,它检查它确实返回了正确的结果。但是,其代码不会被复杂的打印件混淆。 以下几行中的内容很酷:
def f(x):
"""
>>> f(0)
...
42
"""
print('Some complicated printing stuff')
important_result = 42
return important_result
有没有一种优雅的方式来实现这个目标?
答案 0 :(得分:1)
鉴于此,你的问题有'doctest'标签 - 我假设你想为你的函数运行doctest(在评论部分启发我,任何推定或琐事) - 因为文本含糊不清。
doctest
基本上通过以 Python交互式会话的形式查找文本来工作。此文本可以写在docstring
中(就像您在第二个代码块/示例中一样)或单独的文件中。
要运行doctest,首先要指定以下代码(对于您提到的代码示例,您只需键入确切的行):
if __name__ = "__main__":
import doctest
doctest.testmod()
doctest
模块。 如果您的模块中包含上述代码(* .py文件),只需以脚本形式运行:
python yourmodule.py
OR, 您可以直接运行doctest(没有上面3行代码):
pyhton -m doctest yourmodule.py
使用单独的文件 - 在您的文件中添加以下行:
if __name__ = "__main__"
import doctest
doctest.testfile("somefile.txt")
它将识别并执行文件中的任何交互式Python文本。默认情况下,testfile()
将在模块(.py文件)所在的同一目录中查找“ somefile.txt ”(使用我们可以在其他位置查找文件的选项)。
回到你的问题
我想写一个
doctest
,它会检查它确实会返回 正确的结果。但是其代码不会被复杂的代码混淆 印刷品。以下几行中的内容很酷:
否(直接不可能) - 通过在doctest
中以Python交互式会话的形式指定示例来设置/编写docstring
的方案 - 正如所提到的那样一个好的做法是在交互式会话中使用各种输入运行您的函数,并在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的回答