详细函数的文档测试

问题描述 投票:0回答:3

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

def f(x):
  print('Some complicated printing stuff')
  important_result = 42
  return important_result

我想编写一个文档测试,它检查它是否确实返回了正确的结果。但其代码不会被复杂的打印内容所混淆。 以下内容会很酷:

def f(x): 
    """
    >>> f(0)
    ...
    42
    """
    print('Some complicated printing stuff')
    important_result = 42
    return important_result

有没有一种优雅的方式来完成这个?

python doctest
3个回答
1
投票

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


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

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

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

if __name__ = "__main__":
    import doctest
    doctest.testmod()
  1. 第 1 行 - 仅当模块(您的 *.py 文件)时运行以下代码 作为脚本运行,即未导入等(更详细的答案此处
  2. 第 2 行 - 导入
    doctest
    模块。
  3. 第 3 行 - 查找任何交互式会话样式文本 文档字符串并运行它。

将上述代码包含在模块(*.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
,它检查它确实返回 正确的结果。但谁的代码不被复杂所混淆 印刷的东西。以下内容会很酷:

NO(直接不可能) -

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


间接方式s:

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


0
投票

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


0
投票

一种选择是打印到 stderr 而不是 stdout 例如

print('Some complicated printing stuff', file=sys.stderr)

打印到stderr不会被doctest检查

© www.soinside.com 2019 - 2024. All rights reserved.