有时我遇到以下问题。我有一个函数,该函数返回我感兴趣的东西并打印我不在乎的东西。例如。

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/

10-13 07:43