2012-08-01 52 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