有时我遇到以下问题。我有一个函数,该函数返回我感兴趣的东西并打印我不在乎的东西。例如。
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
是否有一种优雅的方式来完成此任务?
最佳答案
鉴于此,您的问题带有标签'doctest'-我假设您要为您的功能运行doctest(在注释部分,对于任何假定或琐碎之处,请给我启发)-因为文本不明确。doctest
基本上是通过以Python交互式会话的形式查找文本来工作的。该文本可以写在docstring
中(就像您在第二个代码块/示例中一样)或单独的文件中。
使用文档字符串-您要做的就是指定几个(或至少一个)函数示例,即以与Python交互式会话完全相同的格式传递所需的参数和预期的结果。一个好的做法是在交互式会话中运行您的函数,然后将其复制粘贴到该函数的文档字符串中。
要运行doctest,首先指定以下代码(对于您提到的代码示例,只需键入确切的行):
if __name__ = "__main__":
import doctest
doctest.testmod()
第1行-仅在模块(您的* .py文件)下运行以下代码
作为脚本运行,即未导入等(更详细的答案here)
第2行-导入
doctest
模块。第3行-在
docstring并运行它。
将上述代码包含在模块(* .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
来检查它是否确实返回了正确的结果。但是其代码不会被复杂的代码所混淆
印刷的东西。遵循以下思路很酷:
否(直接不可能)-通过在您的
doctest
中以Python交互式会话的形式指定示例来设置/编写docstring
的场景-正是如上所述,即一种好的做法是在函数中使用各种输入来运行函数交互式会话,然后将这些行复制并粘贴到docstring
中-所有print
语句肯定会存在,并且doctest的一部分内容会将测试标记为通过。间接方式:
在函数中使用可选参数,例如
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的答案
关于python - 详细功能文档测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29513866/