2009-11-27 95 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