18

我在类方法中有一个带有文档字符串的 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
        """

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

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

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

4

4 回答 4

22

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

"""
>>> def example():
...    from packagename import module
...    module.show_real_world_usage()
...
>>> example() # doctest: +SKIP
'Hello world!'
"""
于 2011-10-01T19:09:20.273 回答
7

我的解决方案是修剪我希望 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 指令。

于 2009-11-27T16:00:58.547 回答
2

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

example_usage = """
Real-world example:

# python2.5
...
"""

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

使用__example_usage__(或用双下划线包围的其他内容)可能会更好,这样很明显这是一个“魔术”变量,而不是在脚本上下文中使用的变量。

于 2009-11-27T14:28:02.693 回答
2

基于RobM 的答案构建的一个小解决方法通过使用 >>> 开始示例来保留显示/格式,如下所示:

""" 
>>>
>> from packagename import module 
>> module.show_real_world_usage() 
'Hello world!' 
"""
于 2019-03-05T11:55:21.837 回答