2009-06-21 11 views
22

मैं इस तरह एक डॉक्टरेट लिखना चाहता हूं:क्या पाइथन कुछ आउटपुट लाइनों को अनदेखा कर सकता है?

""" 
>>> print a.string() 
      foo : a 
      bar : b 
     date : <I don't care about the date output> 
      baz : c 
""" 

क्या ऐसा करने का कोई तरीका है? मुझे लगता है कि यह अवांछित स्विच करने के लिए और अधिक समझ में आता है, लेकिन मुझे उत्सुकता है कि आउटपुट की एक श्रृंखला निर्दिष्ट करना संभव है जिसे परीक्षण में परीक्षण के लिए मेल नहीं किया जाना चाहिए।

धन्यवाद!

उत्तर

31

doctest.ELLIPSIS के साथ, आप ... का उपयोग "किसी भी स्ट्रिंग से मेल खाने" के लिए कर सकते हैं। आप एक doctest निर्देश के साथ doctest विकल्प सेट कर सकते हैं, यह सिर्फ एक परीक्षण मामले के लिए सक्रिय करने के लिए: online docs में एक उदाहरण है:

>>> print range(20) # doctest:+ELLIPSIS 
[0, 1, ..., 18, 19] 

आप एक doctest विकल्प भर सक्रिय होना चाहते हैं, तो आप इसे के रूप में पारित कर सकते हैं optionflags= आपके द्वारा उपयोग किए जाने वाले सबसे अच्छे कार्यों के लिए तर्क, उदाहरण के लिए doctest.testfile। (आप | ऑपरेटर को बिट-या उन्हें उपयोग करके वहां कई विकल्प झंडे पास कर सकते हैं)।

+1

लेकिन हम पूरी लाइन को कैसे नजरअंदाज कर सकते हैं? –

+1

@ t0ster, बस 'अपेक्षित आउटपुट "के रूप में' ... '' 'dctest.ELLIPSIS' सेट के साथ), और सबसे अच्छा उस आउटपुट लाइन पर किसी भी सामग्री को स्वीकार करेगा, यानी।आउटपुट के "पूरी लाइन को अनदेखा करें"। –

+5

"पूरी रेखा को अनदेखा करें" जैसा उपरोक्त काम नहीं करता है क्योंकि पिछले रेखा की एक (पायथन) निरंतरता के साथ इलिप्सिस को सबसे ज्यादा भ्रमित करता है। मुझे पूरी लाइन को अनदेखा करने का कोई रास्ता नहीं मिला। असल में, मैं "पूरे आउटपुट को अनदेखा" ढूंढ रहा था। –

4

हालांकि पूरी लाइन को अनदेखा करना थोड़ा मुश्किल है। यहाँ:

""" 
>>> do_your_thing() #doctest:+ELLIPSIS 
... 
""" 

ट्रिपल बिंदु रेखा निरंतरता के रूप में व्याख्या की जाएगी, और एक सिंटैक्स त्रुटि का कारण है। के बारे में "कैसे हम पूरी लाइन की उपेक्षा कर सकते" सवाल का जवाब देते हुए

""" 
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS 
skip from here ... 
""" 
+0

धन्यवाद, यह एक उपयोगी हैक है! –

8

:

आप पूरी लाइन को अनदेखा करना चाहते हैं, तो आप की तरह कुछ की आवश्यकता होगी हाँ, तथ्य यह है कि "... "एक निरंतरता की तरह दिखता है जैसे पूरे आउटपुट को अनदेखा करना मुश्किल बनाता है। यदि आप केवल उदाहरण को पूरी तरह से छोड़ना चाहते हैं, तो आप "#doctest: + SKIP" का उपयोग कर सकते हैं, लेकिन यदि आप इसके दुष्प्रभावों पर भरोसा कर रहे हैं तो यह काम नहीं करेगा। यदि आप वास्तव में यह करने के लिए की जरूरत है, मुझे लगता है आप, doctest मॉड्यूल में ही बंदर-पैच सकता है, हालांकि मैं विशेष रूप से यह सिफारिश नहीं होगा: (। इस परीक्षण से गुजरता है)

>>> import doctest 
>>> doctest.ELLIPSIS_MARKER = '-etc-' 
>>> print 12 # doctest: +ELLIPSIS 
-etc- 

या आप अस्थायी रूप से stdout और/या stderr को दबाने सकता है: (। इस परीक्षण भी गुजरता है)

>>> # Suppress stdout 
>>> import sys 
>>> class DevNull: 
...  def noop(*args, **kwargs): pass 
...  close = write = flush = writelines = noop 
>>> sys.stdout = DevNull() 
>>> # Run a test and ignore output (but we need its side effects) 
>>> print 12 # NOTE: stdout is suppressed! 
>>> # Restore stdout 
>>> sys.stdout = sys.__stdout__ 

0

Can I have an ellipsis at the beginning of the line in a Python doctest? exp लेंस कैसे एक कस्टम आउटपुट चेकर बनाने के लिए है जो एक अतिरिक्त स्ट्रिंग का उपयोग इलिप्सिस के रूप में करता है। यह आपको निम्नलिखित लिखने देता है, जबकि अभी भी '...' कहीं और इस्तेमाल किया जाता है।

def foo(): 
    """ 
    >>> foo() # doctest: +ELLIPSIS 
    [...] world 
    """ 
    print "hello world" 
5

मैंने पाया यह आसान बस एक चर के लिए अनावश्यक वापसी मान निर्दिष्ट:

>>> _ = do_something() 
>>> check_something() 
True 
+0

सबसे सरल, ब्रावो – michaelsnowden

1

आप से पहले और अपने समारोह (हैक मार्क होर्वाथ के जवाब से प्रेरित) के बाद tuples लिख सकते हैं:

def foo(): 
    """ 
    >>>();foo();() # doctest: +ELLIPSIS 
    (...) 
    """ 
    print "Hello world" 
    return "Hello world" 
संबंधित मुद्दे