2012-08-01 15 views
6

एक फ़ंक्शन फ़िक्स(), एक आउटपुट फ़ंक्शन के लिए एक सहायक फ़ंक्शन के रूप में है जो टेक्स्ट फ़ाइल में तार लिखता है।सबसे व्यस्त एस्केपिंग अक्षर

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 

doctests चालू किया जा रहा है, मैं निम्नलिखित त्रुटि मिलती है:

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 काम करना चाहते हैं के लिए, नहीं लगता है, भले ही समारोह पूरी तरह से काम करता है। एक संदेह है कि यह ब्लॉक टिप्पणी में सबसे व्यस्त होने का परिणाम है, लेकिन इसे हल करने के लिए कोई सुझाव है।

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

ध्यान दें कि आप डबल-कोटेड तार में एकल उद्धरण से बचने के लिए की जरूरत नहीं है, और अजगर नहीं है कि:

+0

ध्यान दें कि एक तिहाई उद्धृत स्ट्रिंग वास्तव में एक ब्लॉक-टिप्पणी नहीं है (हालांकि मैंने इसे इस तरह उपयोग किया है)। एक ट्रिपल उद्धृत स्ट्रिंग केवल एक स्ट्रिंग है जिसे इसमें एक नई लाइन रखने की अनुमति है। जब कोई टिप्पणी के रूप में उपयोग किया जाता है, तो आप वास्तव में क्या कर रहे हैं एक स्ट्रिंग बना रहा है और इसे किसी भी चीज़ को असाइन नहीं कर रहा है (उदाहरण के लिए स्ट्रिंग बनाना और फिर इसे फेंकना)। पाइथन में वास्तव में ब्लॉक-टिप्पणी नहीं होती है ... स्ट्रिंग्स जो तुरंत फ़ंक्शन परिभाषा का पालन करती हैं विशेष होती हैं और फ़ंक्शन के '__doc__' विशेषता को निहित रूप से असाइन की जाती हैं। – mgilson

उत्तर

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

मुझे नहीं लगता कि यह सही है, क्योंकि यह फ़ंक्शन के लिए एक अलग स्ट्रिंग में होगा, तो ओपी का इरादा है। –

+0

@ स्वेनमार्कैच - मुझे नहीं पता कि ओपी किस स्ट्रिंग को सबसे अच्छा (मेरे स्वाद के लिए बहुत से बचने के दृश्य) के माध्यम से गुज़रने का इरादा रखता है। लेकिन फ़ंक्शन करता है जो डॉक्टर स्ट्रिंग के लिए पूछता है, और यह गुजरता है ... मैं कुछ और परीक्षणों के साथ अद्यतन करूंगा ... – mgilson

+0

क्षमा करें, मेरा मतलब डबल-कोट्स के बजाय मूल प्रश्न में सिंगल कोट्स था, लेकिन यह कोशिश करेंगे! – zhuyxn

1

सबसे पहले, तो ऐसा होता है, तो आप वास्तव में इंटरैक्टिव दुभाषिया में अपने कार्य कहते हैं परिणामस्वरूप स्ट्रिंग के प्रतिनिधित्व में ऐसा करें - केवल बैक स्लैश बच निकला है।

इसका मतलब यह है सही docstring होना चाहिए

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

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

""" 

मैं इस docstring के लिए एक कच्चे स्ट्रिंग शाब्दिक प्रयोग करेंगे यह अधिक पठनीय बनाने के लिए (अपरीक्षित!):

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

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

""" 
+0

क्षमा करें मैंने मूल प्रश्न में एक टाइपो बनाया था, और इसके बजाय एक सिंगल-कोट था, मैं आपके समाधान को समझता हूं और डबल-कोट्स का उपयोग करते समय मुझे अपना परीक्षण करने के लिए परीक्षण मिला, लेकिन क्या एक कारण है कि एकल-कोट केस काम नहीं करता? – zhuyxn

संबंधित मुद्दे