Various behaviors of doctest

Peter Otten __peter__ at web.de
Mon Feb 28 06:27:47 EST 2011


Gnarlodious wrote:

> Yeah, I just spent about 2 hours trying everything I could think of...
> without success. Including your suggestions. Guess I'll have to skip
> it. But thanks for the ideas.
> 
> -- Gnarlie

Are you using Python 2.x? Then you cannot redefine print. Instead you have 
to redirect stdout. The following example should run as a cgi script:

#!/usr/bin/env python
import cgi
import sys
from cStringIO import StringIO

def f():
    """
    >>> 1 + 1
    2
    >>> 2 + 2
    22
    >>> "<"
    '<'
    """

if __name__ == "__main__":
    print ("Content-type: text/html\r\n\r\n"
           "<html><body style='background-color:#f0f0f0'>"
           "<h1 style='color: navy;'>There goes:</h1>")

    outstream = StringIO()
    import doctest, sys

    from doctest import DocTestRunner
    class DTR(DocTestRunner):
        def run(self, test, compileflags=None, out=None, clear_globs=True):
            DocTestRunner.run(self, test, compileflags, outstream.write, 
clear_globs)
        def summarize(self):
            saved = sys.stdout
            sys.stdout = outstream
            DocTestRunner.summarize(self)
            sys.stdout = saved

    doctest.DocTestRunner = DTR
    doctest.testmod(verbose=True)
    text = outstream.getvalue()
    
    for line in text.splitlines():
        spaces = len(line) - len(line.lstrip())
        line = line.strip()
        if "*****" in line:
            print "<hr/>"
        else:
            print "<div style='color: %s; margin-left:%sem;'>%s</div>" % (
                "blue" if spaces else "black", spaces, cgi.escape(line))
    print "</body></html>"




More information about the Python-list mailing list