【问题标题】:Python doctest: Skip entire block?Python doctest:跳过整个块?
【发布时间】:2009-11-27 14:17:13
【问题描述】:

我在类方法中有一个带有文档字符串的 Python 模块,在模块文档字符串中有一个真实示例。区别在于方法文档字符串经过精心设计,可以完全重复测试,而真实世界的示例只是 Linux shell 历史记录的复制粘贴——恰好调用了 python 解释器。

例如

"""
Real-world example:

# python2.5
Python 2.5 (release25-maint, Jul 20 2008, 20:47:25)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from packagename import module
>>> module.show_real_world_usage()
'Hello world!'
"""

class SomeClass(object):
    def someMethod(self):
        """
        >>> 1 == 1
        True
        """

我想在 SomeClass.someMethod 中运行 doctest,但不在模块的文档字符串中。

Doctest 的 +SKIP 指令仅适用于每行,这意味着在我的真实示例中添加 10 行。丑!

有没有办法让 doctest 跳过整个块?有点像 HTML 中的<!-- ... -->

【问题讨论】:

    标签: python doctest


    【解决方案1】:

    将示例包装在一个函数中,然后跳过函数调用:

    """
    >>> def example():
    ...    from packagename import module
    ...    module.show_real_world_usage()
    ...
    >>> example() # doctest: +SKIP
    'Hello world!'
    """
    

    【讨论】:

      【解决方案2】:

      我的解决方案是修剪我希望 doctest 跳过它们的 3 个字符的 >>>... 领导者,使它们成为 2 个字符。

      所以

      """
      >>> from packagename import module
      >>> module.show_real_world_usage()
      'Hello world!'
      """
      

      变成了

      """
      >> from packagename import module
      >> module.show_real_world_usage()
      'Hello world!'
      """
      

      Epydoc 的显示效果不如 doctests,但我可以接受。不过,欢迎使用 doctest 中的 skip-until-further-notice 指令。

      【讨论】:

      • 可以在此处找到有关显示的解决方法:stackoverflow.com/a/55002297/5350621
      • 示例无法复制粘贴到 IPython REPL 中并在之后工作。
      • 这不适合搜索。毫无疑问,其他工作流程也是如此
      【解决方案3】:

      如果无论如何它不是一个实际的 doctest,您可以将值分配给一个变量。例如,

      example_usage = """
      Real-world example:
      
      # python2.5
      ...
      """
      

      将导致该“测试”不被评估。

      最好使用__example_usage__(或用双下划线括起来的其他内容),这样可以清楚地看出这是一个“神奇”变量,而不是在脚本上下文中使用的变量。

      【讨论】:

      【解决方案4】:

      建立在RobM's answer 基础上的一个小解决方法通过使用 >>> 开始示例来保留显示/格式:

      """ 
      >>>
      >> from packagename import module 
      >> module.show_real_world_usage() 
      'Hello world!' 
      """
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 2020-07-13
        • 2012-11-03
        • 1970-01-01
        • 2013-12-20
        相关资源
        最近更新 更多