2012-08-01 8 views
6

Tiene una función fix(), como función auxiliar de una función de salida que escribe cadenas en un archivo de texto.Doctest que implica caracteres de escape

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 

Encendido de prueba unitaria, me sale el siguiente error:

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') 
       ^

No importa qué combinación de \ y 's utilizo, no parece la doctest a querer trabajar, a pesar de la función en sí funciona perfectamente. Sospeche que es el resultado de que el miembro más docto esté en un comentario bloqueado, pero tenga algún consejo para resolverlo.

+0

Tenga en cuenta que una cadena con comillas triples no es realmente un comentario en bloque (aunque lo he visto utilizado como tal). Una cadena con comillas triples es solo una cadena a la que se le permite tener una nueva línea. Cuando se usa como comentario, lo que realmente está haciendo es crear una cadena y no asignarla a nada (por ejemplo, crear la cadena y luego tirarla). Python en realidad no tiene un comentario en bloque ... las cadenas que siguen inmediatamente a una definición de función son especiales y están implícitamente asignadas al atributo '__doc__' de la función. – mgilson

Respuesta

5

Es esto lo que quieren ?:

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() 

cuerdas primas son de su amigo ...

+0

No creo que esto sea correcto, ya que esto pasaría en una cadena diferente a la función que el OP pretendía. –

+0

@SvenMarnach - No sé qué cadena el OP intentó pasar por el doctest (demasiadas secuencias de escape para mi gusto). Pero la función hace lo que pide la cadena de documentación, y pasa ... Actualizaré sin embargo con algunas pruebas más ... – mgilson

+0

Disculpa, quise decir comillas simples en la pregunta original en lugar de comillas dobles, pero probaré esto! – zhuyxn

1

En primer lugar, esto es lo que pasa si en realidad se llama a su función en el intérprete interactivo:

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

Tenga en cuenta que no es necesario para escapar comillas simples en cadenas entre comillas dobles, y que Python no lo hace Haga esto en la representación de la cadena resultante: solo se escapa la barra invertida.

Esto significa que la cadena de documentación correcta debería ser

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

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

""" 

que haría uso de una cadena de texto literal para esta cadena de documentación para que esta sea más legible (no probado!):

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

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

""" 
+0

Lo siento, cometí un error ortográfico en la pregunta original, y en su lugar, me refería a una cita única, entiendo su solución y logré que mi prueba funcionara al usar comillas dobles, pero ¿hay alguna razón por la cual el caso de una sola cita ¿No funciona? – zhuyxn

Cuestiones relacionadas