Doctest详细功能

时间:2015-04-08 11:53:54

标签: python doctest

我有时会遇到以下问题。我有一个函数,它返回我感兴趣的东西并打印一些我不关心的东西。例如。

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

有没有一种优雅的方式来实现这个目标?

1 个答案:

答案 0 :(得分:1)

鉴于此,你的问题有'doctest'标签 - 我假设你想为你的函数运行doctest(在评论部分启发我,任何推定或琐事) - 因为文本含糊不清。


doctest基本上通过以 Python交互式会话的形式查找文本来工作。此文本可以写在docstring中(就像您在第二个代码块/示例中一样)或单独的文件中。

  1. 使用文档字符串 - 所有您需要做的就是指定少量(或至少一个)函数示例,即传递所需参数和预期结果,完全采用与Python交互相同的格式会话。一个好的做法是在交互式会话中运行您的函数,并将其复制粘贴到函数的文档字符串中。
  2. 要运行doctest,首先要指定以下代码(对于您提到的代码示例,您只需键入确切的行):

    if __name__ = "__main__":
        import doctest
        doctest.testmod()
    
    1. 第1行 - 仅当模块(您的* .py文件)运行以下代码 以脚本运行,即未导入等(更详细的答案here
    2. 第2行 - 导入doctest模块。
    3. 第3行 - 查找中的任何交互式会话样式文本 docstring并运行它。
    4. 如果您的模块中包含上述代码(* .py文件),只需以脚本形式运行:

      python yourmodule.py
      

      OR, 您可以直接运行doctest(没有上面3行代码):

      pyhton -m doctest yourmodule.py
      
      1. 使用单独的文件 - 在您的文件中添加以下行:

        if __name__ = "__main__"    
             import doctest
             doctest.testfile("somefile.txt")
        
      2. 它将识别并执行文件中的任何交互式Python文本。默认情况下,testfile()将在模块(.py文件)所在的同一目录中查找“ somefile.txt ”(使用我们可以在其他位置查找文件的选项)。


        回到你的问题

          

        我想写一个doctest,它会检查它确实会返回   正确的结果。但是其代码不会被复杂的代码混淆   印刷品。以下几行中的内容很酷:

        (直接不可能) - 通过在doctest中以Python交互式会话的形式指定示例来设置/编写docstring的方案 - 正如所提到的那样一个好的做法是在交互式会话中使用各种输入运行您的函数,并在docstring中复制粘贴这些行 - 并且所有print语句肯定会在那里,并且部分用于doctest将测试标记为已通过。


        间接方式 s:

        1. 在函数中使用可选参数,例如printing - 您需要对函数进行更改,即在print下移动if语句。
        2.      def f(x, printing=True): 
                      """
                      f(0, printing=False)
                      ...
                      42
                      """
                      if printing:
                          print('Some complicated printing stuff')
                      important_result = 42
                      return important_result 
          

          1. None参数传递给print函数 - 请注意,它将传递给模块中的所有打印调用,即整个*.py文件。
          2.     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的回答