2012-08-01 16 views
6

Haben Sie eine Funktion fix(), als Hilfsfunktion für eine Ausgabefunktion, die Strings in eine Textdatei schreibt.Doctest mit Escape-Zeichen

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 

Einschalten Doctests, ich die folgende Fehlermeldung erhalten:

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

Egal welche Kombination von \ und ‚s ich verwende, wird der doctest nicht scheinen zu wollen, arbeiten, auch wenn Die Funktion selbst funktioniert einwandfrei. Haben Sie den Verdacht, dass es ein Ergebnis des Doctests ist, der in einem Blockkommentar ist, aber irgendwelche Tipps, um dies zu beheben.

+0

Beachten Sie, dass ein dreifacher String in Anführungszeichen nicht wirklich ein Blockkommentar ist (obwohl ich ihn als solchen gesehen habe). Eine dreifache Zeichenfolge in Anführungszeichen ist nur eine Zeichenfolge, die eine neue Zeile enthalten darf. Wenn Sie als Kommentar verwendet werden, erstellen Sie einen String und weisen ihn keinem Objekt zu (z. B. das Erstellen des Strings und das anschließende Wegwerfen). Python hat eigentlich keinen Blockkommentar ... die Strings, die unmittelbar einer Funktionsdefinition folgen, sind speziell und werden implizit dem Attribut '__doc__' der Funktion zugewiesen. – mgilson

Antwort

5

Ist das, was Sie wollen ?:

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

rohe Strings sind dein Freund ...

+0

Ich glaube nicht, dass das richtig ist, da dies in einer anderen Zeichenfolge an die Funktion übergeben würde, als das OP beabsichtigt. –

+0

@SvenMarnach - Ich weiß nicht, welche Zeichenfolge das OP über den Doctest weiterleiten wollte (zu viele Escape-Sequenzen für meinen Geschmack). Aber die Funktion tut, was die Doc-Zeichenfolge verlangt, und es vergeht ... Ich werde aber mit einigen weiteren Tests aktualisieren ... – mgilson

+0

Sorry, ich hatte in der ursprünglichen Frage einfache Anführungszeichen statt doppelte Anführungszeichen gemeint, aber werde das ausprobieren! – zhuyxn

1

Erstens ist es das, was passiert, wenn Sie tatsächlich Ihre Funktion im interaktiven Interpreter nennen:

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

Beachten Sie, dass Sie nicht brauchen, einfache Anführungszeichen in Strings mit doppelten Anführungszeichen zu entkommen, und dass Python nicht Tun Sie dies in der Darstellung der resultierenden Zeichenfolge - nur der umgekehrte Schrägstrich wird maskiert.

Das bedeutet, die richtige docstring sollte

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

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

""" 

ich wörtliche eine rohe Zeichenfolge für dieses docstring diese besser lesbar zu machen verwenden würde (nicht getestet!):

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

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

""" 
+0

Entschuldigung, ich hatte einen Tippfehler in der ursprünglichen Frage gemacht und stattdessen einen einfachen Anführungsstrich gemeint, ich verstehe Ihre Lösung und ich habe meinen Test zur Arbeit mit doppelten Anführungszeichen bekommen, aber gibt es einen Grund, warum der einfache Anführungsstrich funktioniert nicht? – zhuyxn

Verwandte Themen