2012-08-01 12 views
6

Avere una funzione fix(), come funzione di supporto per una funzione di output che scrive stringhe su un file di testo.Doct coinvolge personaggi di 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 

Accensione doctests, ottengo il seguente errore:

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

Non importa quale combinazione di \ e 's che uso, il doctest non sembra voler lavorare, anche se la funzione stessa funziona perfettamente. Avere il sospetto che sia il risultato del doctest in un commento di blocco, ma qualche consiglio per risolverlo.

+0

Si noti che una stringa con quotatura tripla non è in realtà un commento di blocco (anche se l'ho visto usato come tale). Una stringa con quotatura tripla è solo una stringa a cui è consentito avere una nuova riga. Se usato come commento, quello che stai facendo è creare una stringa e non assegnarla a qualcosa (ad esempio creando la stringa e poi gettandola via). Python in realtà non ha un commento di blocco ... le stringhe che seguono immediatamente una definizione di funzione sono speciali e sono assegnate implicitamente all'attributo '__doc__' della funzione. – mgilson

risposta

5

E 'questo che vogliono ?:

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

stringhe prime sono tuo amico ...

+0

Non penso che sia giusto, poiché questo passerebbe in una stringa diversa alla funzione, quindi l'OP intendeva. –

+0

@SvenMarnach - Non so quale stringa intendesse passare l'OP tramite il doctest (troppe sequenze di escape per i miei gusti). Ma la funzione fa quello che chiede la stringa doc, e passa ... aggiornerò comunque con qualche altro test ... – mgilson

+0

Scusa, volevo dire virgolette singole nella domanda originale piuttosto che virgolette, ma proveremo questo! – zhuyxn

1

In primo luogo, questo è quello che succede se si chiama in realtà la funzione nell'interprete interattivo:

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

Si noti che non è necessario per sfuggire virgolette singole in stringhe tra doppi apici, e che Python non fai questo nella rappresentazione della stringa risultante - solo la barra rovesciata viene sfuggita.

Questo significa che la docstring corretta dovrebbe essere

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

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

""" 

userei una stringa letterale RAW per questa stringa di documentazione per renderlo più leggibile (non testata!):

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

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

""" 
+0

Mi spiace di aver fatto un refuso nella domanda originale, e invece di una virgoletta singola, ho capito la tua soluzione e ho fatto in modo che il mio test funzionasse quando si utilizzava virgolette, ma c'è un motivo per cui il caso di virgolette singole non funziona? – zhuyxn