2012-08-01 98 views
6

有一個函數fix(),作爲將字符串寫入文本文件的輸出函數的輔助函數。Doctest涉及轉義字符

def fix(line): 
    """ 
    returns the corrected line, with all apostrophes prefixed by an escape character 

    >>> fix('DOUG\'S') 
    'DOUG\\\'S' 

    """ 
    if '\'' in line: 
     return line.replace('\'', '\\\'') 
    return line 

打開文檔測試,我得到以下錯誤:

Failed example: 
    fix('DOUG'S') 
Exception raised: 
    Traceback (most recent call last): 
     File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py", line 1254, in __run 
     compileflags, 1) in test.globs 
     File "<doctest convert.fix[0]>", line 1 
     fix('DOUG'S') 
       ^

不管我用什麼樣的\組合和年代,文檔測試似乎並不想工作,即使該功能本身完美工作。懷疑這是由於doctest在阻止評論中的結果,但有任何提示可以解決此問題。

+0

請注意,三重引號的字符串並不是真正的塊註釋(儘管我已經看到它是這樣使用的)。三重引號字符串只是一個允許在其中包含換行符的字符串。當作爲註釋使用時,你真正在做的是創建一個字符串,而不是將它分配給任何東西(例如創建字符串然後丟棄它)。 Python實際上沒有塊註釋......緊跟在函數定義之後的字符串是特殊的,並且隱含地分配給函數的__doc__屬性。 – mgilson 2012-08-01 19:03:09

回答

5

這就是你要?:

def fix(line): 
    r""" 
    returns the corrected line, with all apostrophes prefixed by an escape character 

    >>> fix("DOUG\'S") 
    "DOUG\\'S" 
    >>> fix("DOUG'S") == r"DOUG\'S" 
    True 
    >>> fix("DOUG'S") 
    "DOUG\\'S" 

    """ 
    return line.replace("'", r"\'") 

import doctest 
doctest.testmod() 

原始字符串是你的朋友?

+0

我不認爲這是正確的,因爲這會傳遞給不同的字符串,然後是OP的意圖。 – 2012-08-01 18:48:50

+0

@SvenMarnach - 我不知道OP打算通過doctest傳入什麼字符串(我的口味中有太多的轉義序列)。但是函數完成了doc字符串所要求的操作,並且它會通過...我將通過一些更多的測試更新... – mgilson 2012-08-01 18:57:55

+0

對不起,我在原始問題中的意思是單引號而不是雙引號,但會試試這個! – zhuyxn 2012-08-01 19:00:29

1

首先,這是如果你真的打電話給你的功能在交互式解釋發生了什麼:

>>> fix("Doug's") 
"Doug\\'s" 

請注意,您不必逃避雙引號字符串單引號,而Python不會在結果字符串的表示形式中執行此操作 - 只有反斜槓纔會被轉義。

這意味着正確的文檔字符串應該是

""" 
returns the corrected line, with all apostrophes prefixed by an escape character 

>>> fix("DOUG'S") 
"DOUG\\\\'S" 

""" 

我會使用一個原始字符串字面這個文檔字符串,使這個更具可讀性(未經測試!):

r""" 
returns the corrected line, with all apostrophes prefixed by an escape character 

>>> fix("DOUG'S") 
"DOUG\\'S" 

""" 
+0

對不起,我在原始問題中犯了一個錯誤,並且意思是單引號,我瞭解您的解決方案,並且在使用雙引號時確實使我的測試正常工作,但單引號的情況是否有原因不起作用? – zhuyxn 2012-08-01 19:07:00