2010-03-08 33 views
6

是有什麼辦法文檔測試本地定義的功能呢?作爲一個例子,我想文檔測試本地定義功能

def foo(): 
    """ >>> foo() 
    testfoo""" 

    def foo2(): 
    """ >>> 1/0 """ 
    print 'testfoo' 

    foo2() 

不通過測試。但我仍不想讓foo2的全球對整個模塊...

回答

1

你只是有一個空格的問題 - 如果你解決這個問題,舉例如下:

def foo(): 
    """ 
    >>> foo() 
    testfoo""" 

    def foo2(): 
    """ >>> 1/0 """ 
    print 'testfoo' 

    foo2() 

if __name__ == '__main__': 
    import doctest 
    doctest.testmod() 

測試只是傳遞精細。

+0

這是一個拼寫錯誤和混淆我的意圖:我想測試__NOT__通過。我想要得到的東西,如「ZeroDivisionError:整數除零或模」由於foo2的的文檔測試字符串。問題是如何測試子例程。 – 2010-03-10 17:29:24

+0

啊,我明白了。嵌套的**函數的文檔字符串在(嵌套的)函數對象本身不存在時不可見 - 並且在代碼中,foo2的函數對象僅在執行外部函數foo的過程中存在。 (在正常的閉包工廠中,外層函數返回內層函數對象,而不是在內部使用它作爲實現細節,當然有更多的選項)。基本上,它必須是foo的工作,以某種方式來表達foo2的其他隱藏文檔字符串,因爲沒有其他人可以做到這一點(foo2不存在**爲其他人!)。 – 2010-03-10 18:25:36

1

感謝。我已經擔心在文檔字符串之外沒有辦法解決代碼。我仍然認爲可能有一個技巧來導入函數的局部,從而獲得嵌套函數的訪問權限。總之,採用亞歷克斯」的方法解決方案將讀取

def foo(debug=False): 
    """ 
    >>> foo() 
    testfoo 
    >>> foo(debug=True) 
    """ 

    def foo2(): 
    """ 
     >>> 1/0""" 
    print 'testfoo' 


    if debug : 
    import doctest 
    for f in [foo2]: doctest.run_docstring_examples(f,locals()) 

    foo2() 

現在唯一的問題是如何自動這種方法,所以一個個有類似

for f in locals().values(): doctest.run_docstring_examples(f,locals()) 

,但沒有進口,內置函數和變量。