2009-11-27 52 views
9

我在类方法中有一个带有docstrings的Python模块,并且在模块docstring中有一个真实世界的例子。区别在于方法文档已经被精心制作成完全可重复的测试,而现实世界的例子只是从Linux shell中拷贝历史的一个副本 - 恰巧调用了python解释器。Python doctest:跳过整个块?

E.g.

""" 
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的+SKIP指令只在每行中有效,这意味着要在现实世界中添加10行代码。丑陋!

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

+0

我同意。这是一个非常有用的功能。 – 2009-11-27 15:20:33

回答

6

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

所以

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

已成为

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

epydoc的不作为很好,因为它确实文档测试显示这一点,但我可以用这个活。尽管如此,doctest中的skip-until-further-notice指令仍然值得欢迎。

1

如果这不是一个真正的doctest通过任何方式,您可以将该值分配给一个变量。例如,

example_usage = """ 
Real-world example: 

# python2.5 
... 
""" 

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

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

+1

整洁,但它帮助()和epydoc也是不可见的。 – RobM 2009-11-27 14:32:19

+0

我不确定'help()',但你可以在epydoc中添加一个新字段:http://epydoc.sourceforge.net/epydoc.html#adding-new-fields – 2009-11-27 14:35:30

9

包裹在一个函数的例子,然后跳到函数调用:

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

我想你错过了冒号,我认为它应该是'#doctest:+ SKIP',如果没有它,它就无法工作,但是很好的解决方法,谢谢 – 2013-03-04 18:20:46

+0

@IdaN Yup。指令需要冒号。感谢:http://docs.python.org/2/library/doctest.html#directives – lambacck 2013-03-04 18:39:53