【问题标题】:Doctest of verbose function详细函数的 Doctest
【发布时间】:2015-04-08 11:53:54
【问题描述】:

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

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

有没有优雅的方法来完成这个?

【问题讨论】:

  • 如果以下帖子是问题的解决方案或在某种程度上回答了您的问题,请接受它作为答案,因为它会对其他人有所帮助。

标签: python doctest


【解决方案1】:

鉴于此,您的问题有标签“doctest”-我假设您想为您的函数运行 doctest(在评论部分启发我,以了解任何假设或琐事)-因为文本模棱两可。


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

  1. 使用文档字符串 - 您所要做的就是指定几个(或至少一个)函数示例,即传递所需的参数和预期的结果,格式与 Python 交互式会话完全相同。一个好的做法是在交互式会话中运行您的函数并将其复制粘贴到函数的文档字符串中。

要运行 doctest,首先指定以下代码(对于您提到的代码示例,您只需键入确切的行):

if __name__ = "__main__":
    import doctest
    doctest.testmod()
  1. 第 1 行 - 运行以下代码,仅当模块(您的 *.py 文件) 作为脚本运行,即不导入等(更详细的答案here
  2. 第 2 行 - 导入 doctest 模块。
  3. 第 3 行 - 在 docstring 并运行它。

在您的模块(*.py 文件)中包含上述代码后,只需作为脚本运行:

python yourmodule.py

或者, 可以直接运行doctest(不用上面3行代码):

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

    if __name__ = "__main__"    
         import doctest
         doctest.testfile("somefile.txt")
    

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


回到你的问题

我想写一个doctest,它检查它确实返回了 正确的结果。但是谁的代码没有被复杂的 打印的东西。类似以下的内容会很酷:

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


间接方式

  1. 在函数中使用可选参数,例如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 

  1. 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的回答

【讨论】:

    【解决方案2】:

    为了获得一些反馈,我最终打印了 doctest.testmod() 的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2011-07-24
      • 2011-02-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多