Added new parameter exclude_empty to DocTestFinder.__init__, which

controls whether tests are included for objects with empty docstrings.
Defaults to True, to match the behavior of Python 2.3.
This commit is contained in:
Edward Loper 2004-09-13 05:47:24 +00:00
parent c56847878e
commit 32ddbf7fab
2 changed files with 34 additions and 12 deletions

View file

@ -848,7 +848,8 @@ class DocTestFinder:
"""
def __init__(self, verbose=False, parser=DocTestParser(),
recurse=True, _namefilter=None):
recurse=True, _namefilter=None,
exclude_empty=False):
"""
Create a new doctest finder.
@ -860,10 +861,14 @@ def __init__(self, verbose=False, parser=DocTestParser(),
If the optional argument `recurse` is false, then `find` will
only examine the given object, and not any contained objects.
If the optional argument `exclude_empty` is true, then `find`
will exclude tests for objects with empty docstrings.
"""
self._parser = parser
self._verbose = verbose
self._recurse = recurse
self._exclude_empty = exclude_empty
# _namefilter is undocumented, and exists only for temporary backward-
# compatibility support of testmod's deprecated isprivate mess.
self._namefilter = _namefilter
@ -1055,18 +1060,19 @@ def _get_test(self, obj, name, module, globs, source_lines):
else:
try:
if obj.__doc__ is None:
return None
docstring = str(obj.__doc__)
docstring = ''
else:
docstring = str(obj.__doc__)
except (TypeError, AttributeError):
return None
# Don't bother if the docstring is empty.
if not docstring:
return None
docstring = ''
# Find the docstring's location in the file.
lineno = self._find_lineno(obj, source_lines)
# Don't bother if the docstring is empty.
if self._exclude_empty and not docstring:
return None
# Return a DocTest for this object.
if module is None:
filename = None

View file

@ -373,11 +373,21 @@ def test_DocTestFinder(): r"""
>>> (e.source, e.want, e.lineno)
('print sample_func(22)\n', '44\n', 3)
If an object has no docstring, then a test is not created for it:
By default, tests are created for objects with no docstring:
>>> def no_docstring(v):
... pass
>>> finder.find(no_docstring)
>>> finder.find(no_docstring) # doctest: +ELLIPSIS
[<DocTest no_docstring from ... (no examples)>]
However, the optional argument `exclude_empty` to the DocTestFinder
constructor can be used to exclude tests for objects with empty
docstrings:
>>> def no_docstring(v):
... pass
>>> excl_empty_finder = doctest.DocTestFinder(exclude_empty=True)
>>> excl_empty_finder.find(no_docstring)
[]
If the function has a docstring with no examples, then a test with no
@ -404,6 +414,8 @@ def test_DocTestFinder(): r"""
1 SampleClass
3 SampleClass.NestedClass
1 SampleClass.NestedClass.__init__
0 SampleClass.NestedClass.get
0 SampleClass.NestedClass.square
1 SampleClass.__init__
2 SampleClass.a_classmethod
1 SampleClass.a_property
@ -461,6 +473,8 @@ def test_DocTestFinder(): r"""
1 some_module.SampleClass
3 some_module.SampleClass.NestedClass
1 some_module.SampleClass.NestedClass.__init__
0 some_module.SampleClass.NestedClass.get
0 some_module.SampleClass.NestedClass.square
1 some_module.SampleClass.__init__
2 some_module.SampleClass.a_classmethod
1 some_module.SampleClass.a_property
@ -477,7 +491,7 @@ def test_DocTestFinder(): r"""
will only be generated for it once:
>>> from test import doctest_aliases
>>> tests = finder.find(doctest_aliases)
>>> tests = excl_empty_finder.find(doctest_aliases)
>>> tests.sort()
>>> print len(tests)
2
@ -506,6 +520,8 @@ def test_DocTestFinder(): r"""
1 SampleClass
3 SampleClass.NestedClass
1 SampleClass.NestedClass.__init__
0 SampleClass.NestedClass.get
0 SampleClass.NestedClass.square
1 SampleClass.__init__
1 SampleClass.double
1 SampleClass.get
@ -534,7 +550,7 @@ def test_DocTestFinder(): r"""
... return base == 'SampleClass'
>>> tests = doctest.DocTestFinder(_namefilter=namefilter).find(SampleClass)
>>> len(tests)
9
11
Turning off Recursion
~~~~~~~~~~~~~~~~~~~~~