2012-08-01 20 views
6

Bir metin dosyasına dizeleri yazan bir çıktı işlevine yardımcı işlev olarak bir işlev düzeltmesi() yapın. Doctestler açılmasıKaçış Karakterleri İçeren 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 

, aşağıdaki hatayı alıyorum:

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

olursa olsun kullandığım \ ne kombinasyonu ve 's, doctest.testmod olsa çalışmak isteyen için görünmüyor Fonksiyonun kendisi mükemmel çalışır. Bir blok yorumunda doktrininin bir sonucu olduğu, ancak bunu çözmek için herhangi bir ipucu olduğu şüphesi var. Eğer çift tırnak içindeki tek tırnak kaçmayı gerek yoktur ve Python yok olduğunu

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

Not:

+0

Üçlü alıntı yapılan bir dizenin gerçekten bir blok yorumu olmadığını unutmayın (buna benzer şekilde kullanıldığını gördüm). Üçlü bir alıntı dizgisi sadece içinde yeni satır bulunmasına izin verilen bir dizedir. Bir yorum olarak kullanıldığında, gerçekten yaptığınız şey bir dize oluşturup onu herhangi bir şeye atamamaktır (örneğin, dizeyi oluşturmak ve sonra atmak). Python'un aslında bir blok yorumu yoktur ... bir işlev tanımını hemen takip eden dizeler özeldir ve örtük olarak işlevin '__doc__' özniteliğine atanırlar. – mgilson

cevap

5

mı bu nedir size istiyorum ?:

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

ham dizeleri arkadaşınız vardır ...

+0

Bunun doğru olduğunu düşünmüyorum, çünkü bu OP'nin amaçladığı işleve farklı bir dizgeden geçecektir. –

+0

@SvenMarnach - OP'nin doktrin üzerinden geçmeyi tasarladığı diziyi (tadıma göre çok fazla kaçış sırası) bilmiyorum. Ancak işlev, doc dizesinin istediği şeyi yapar ve geçer ... Bazı testlerle güncellemeyi yaparım ... – mgilson

+0

Üzgünüm, çift tırnak yerine orijinal sorudaki tek tırnakları kastetmiştim Bunu deneyecek! – zhuyxn

1

Öncelikle bu aslında interaktif tercüman Işlevinizin çağırırsanız böyle olur Bunu ortaya çıkan dizgenin temsilinde yapın - sadece geri eğik çizgi kaçar.

Bu, doğru docstring'ini olmalıdır anlamına

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

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

""" 

Bunu daha okunabilir hale getirmek için bu docstringe için değişmez bir ham dize kullanmayı tercih ediyorum (denenmemiş!):

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

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

""" 
+0

Özgün soruya bir yazım hatası yaptım ve bunun yerine bir tek tırnak anlamına geliyordu, çözümünüzü anladım ve çift tırnak kullanıldığında testimi işe aldım, ancak tek tırnak durumunun neden bir nedeni var mı? çalışmıyor? – zhuyxn

İlgili konular