Doctests for nested functions

Paddy paddy3118 at netscape.net
Sat Sep 23 09:44:40 CEST 2006


Just wrote:
> In article <1158972773.947401.326850 at i42g2000cwa.googlegroups.com>,
>  bearophileHUGS at lycos.com wrote:
>
> > Can doctests be added to nested functions too? (This can be useful to
> > me, I use nested function when I don't have attributes that I have to
> > remember, but I want to split the logic in some subparts anyway).
>
> I think we had that discussion before, but that's not what nested
> functions are for (in Python). Use modules for that. Also solves your
> doctest problem nicely.
>
> Just

Just is right.
But...
I struggled with coming up with something. The problem is that bar does
not exist in the right form unlee you are executing the function so:

def foo(_test = False):
  r"""
  >>> foo()
  21
  >>> foo(_test = True)
  20
  """
  def bar():
    """
    >>> bar()
    11
    """
    print 10
  print 20

  if _test:
    _locals = locals()

    import doctest

    g = globals().copy()
    g.update(_locals)
    g['__test__'] = {}

    _totest = {}
    for loc in _locals.values():
      try:
        if loc.__doc__ and loc.__name__ and (loc.__name__
            not in g['__test__']):
          _totest[loc.__name__] = loc
      except:
        pass
    for _name, _testing in sorted(_totest.items()):
      doctest.run_docstring_examples(_testing, g,
          name = "foo:" + _name)

import doctest
doctest.testmod()


The output is:

Trying:
    foo()
Expecting:
    21
**********************************************************************
File "__main__", line 3, in __main__.foo
Failed example:
    foo()
Expected:
    21
Got:
    20
Trying:
    foo(_test = True)
Expecting:
    20
**********************************************************************
File "__main__", line 5, in __main__.foo
Failed example:
    foo(_test = True)
Expected:
    20
Got:
    20

**********************************************************************
    File "__main__", line 10, in foo:bar
    Failed example:
        bar()
    Expected:
        11
    Got:
        10
1 items had no tests:
    __main__
**********************************************************************
1 items had failures:
   2 of   2 in __main__.foo
2 tests in 2 items.
0 passed and 2 failed.
***Test Failed*** 2 failures.
*** DocTestRunner.merge: '__main__.foo' in both testers; summing
outcomes.
*** DocTestRunner.merge: '__main__' in both testers; summing outcomes.


- Paddy.
(but use a module instead)!




More information about the Python-list mailing list