2015-04-08 50 views
1

我有時會遇到以下問題。我有一個函數,它返回我感興趣的東西並打印一些我不關心的東西。例如。詳細功能的Doctest

def f(x): 
    print('Some complicated printing stuff') 
    important_result = 42 
    return important_result 

我想寫一個doctest,檢查它是否確實返回正確的結果。但是其代碼不會被複雜的打印內容混淆。 東西大致如下會很酷:

def f(x): 
    """ 
    >>> f(0) 
    ... 
    42 
    """ 
    print('Some complicated printing stuff') 
    important_result = 42 
    return important_result 

是否有acomplish這個優雅的方式?

+0

如果下面的帖子,是解決問題的辦法或有些回答你的問題,接受它作爲回答,因爲它會證明對他人有所幫助, 。 –

回答

1

鑑於這一點,你的問題有標籤'doctest' - 我假設你想爲你的函數運行doctest(在評論部分給我啓發,適用於任何推測或瑣事) - 因爲文本含糊不清。


doctest基本上通過尋找Python交互會話的格式文本的作品。這個文本可以寫在docstring(就像你在第二個代碼塊/示例中)或者在一個單獨的文件中。使用

  1. 文檔字符串 - 所有你需要做的就是指定傳遞所需的參數和預期的結果,恰恰在同一格式的Python交互式會話的功能,即少數(或至少具有一個)的例子。一個好的做法是在交互式會話中運行你的函數,並複製粘貼到函數的文檔字符串中。

要運行的文檔測試,首先指定以下代碼(你提到的代碼示例,你只需要輸入準確的線):

if __name__ = "__main__": 
    import doctest 
    doctest.testmod() 
  1. 1號線 - 運行下面的代碼,只有當模塊(您的* .py文件) 作爲腳本運行時,即未導入等(更詳細的答案here
  2. 第2行 - 導入doctest模塊。
  3. 第3行 - 在 文檔字符串中查找任何交互式會話樣式文本並運行它。

一旦你有你的包含模塊中的上述代碼(* .py文件),只需運行一個腳本:

python yourmodule.py 

OR, 您可以直接運行文檔測試(不含上述3行代碼):

pyhton -m doctest yourmodule.py 
  • 使用一個單獨的文件 - 添加以下行在文件中:

    if __name__ = "__main__"  
        import doctest 
        doctest.testfile("somefile.txt") 
    
  • 它會識別並執行文件中的任何交互式Python文本。默認情況下,testfile()將查找'somefile。txt'位於模塊(.py文件)所在的同一目錄中(使用我們可以在其他位置查找文件的選項)。


    即將回到你的問題

    我想寫一個doctest,檢查,它確實返回 正確的結果。但是其代碼不會被複雜的 印刷材料混淆。大意如下的東西會很酷:

    NO(直接不可能) - 爲doctest場景設置/在你docstring規定在Python交互會話的形式實例寫成 - 如上所述完全即一個好的做法是在交互式會話中用各種輸入來運行你的函數,並複製粘貼docstring中的那些行 - 並且所有的print語句肯定會在那裏,並且doctest的一部分將標記測試通過。


    間接的方式 S:

    1. 使用功能的可選參數,例如printing - 開銷倒是是你需要使移動print語句更改功能,即根據if

     
        def f(x, printing=True): 
          """ 
          f(0, printing=False) 
          ... 
          42 
          """ 
          if printing: 
           print('Some complicated printing stuff') 
          important_result = 42 
          return important_result 
    

    1. pass the None參數print功能 - 當心,它會被傳遞到模塊,即整個*.py文件中的所有打印通話。

     
        def f(x): 
         """ 
         f(0) 
         ... 
         42 
         """ 
         print('Some complicated printing stuff') 
         important_result = 42 
         return important_result 
        if name == 'main': 
         import doctest 
         print = lambda *args, **kwargs: None 
         doctest.testmod() 
    

    來源:jonrsharpe的回答