的文檔測試以下的(無義)Python模塊的失敗:Doctests:如何抑制/忽略輸出?
"""
>>> L = []
>>> if True:
... append_to(L) # XXX
>>> L
[1]
"""
def append_to(L):
L.append(1)
class A(object):
pass
return A()
import doctest; doctest.testmod()
這是因爲線後的輸出標記爲XXX是<__main__.A object at ...>
(其由append_to
返回)。當然,我可以把這個輸出直接放在標記爲XXX的行後面,但在我的情況下,這會使讀者分心,使其不能被實際測試,即功能append_to
的副作用。所以我怎樣才能壓制這個輸出或者我怎麼能忽略它。我試過它:
"""
>>> L = []
>>> if True:
... append_to(L) # doctest: +ELLIPSIS
...
>>> L
[1]
"""
def append_to(L):
L.append(1)
class A(object):
pass
return A()
import doctest; doctest.testmod()
但是,這產生了一個ValueError: line 4 of the docstring for __main__ has inconsistent leading whitespace: ' ...'
。
我不想做的是將行append_to(L)
更改爲這樣會抑制輸出,因爲doctest是爲了文檔的目的,並向讀者展示模塊應該如何使用。 (在這種情況下被記錄在案,append_to
應使用語句似與不似函數編寫_ = append_to(L)
會與此不同的讀者。)
通過提供自包含的可運行代碼,你的意思是什麼?我給出的代碼可以直接用Python解釋器運行(正如我提到的那樣產生了錯誤) - 至少在這裏使用Python 2.6。 至於你的回答:我也想過把所有東西都包裝在一個函數中,這樣返回值就是'None',但是完全如你所寫,這看起來不是一個很乾淨的解決方案。 – Marc 2010-10-05 10:02:06
我只是誤導了它; doctest被寫爲一個單獨的字符串,而不是被測試的屬性 - 我從來不這樣做。無論如何,只要你的測試確實解決了一個單一的結果,上述內容相當乾淨。如果一個測試不適合這種模式,例如。如果你有多個相互關聯的語句,測試一些結果值而不是其他的,那麼它將不會工作得很好。真的需要有一個doctest.DISCARD標誌。 – 2010-10-05 10:10:51