diff options
| -rw-r--r-- | Lib/doctest.py | 22 | ||||
| -rw-r--r-- | Lib/test/test_doctest.py | 24 | 
2 files changed, 34 insertions, 12 deletions
| diff --git a/Lib/doctest.py b/Lib/doctest.py index 2aa740853b..156ef57ca1 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -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 @@ class DocTestFinder:          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 @@ class DocTestFinder:          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 diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index d60738bcbb..a304f5cb27 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -373,11 +373,21 @@ leading path components.      >>> (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 @@ methods, classmethods, staticmethods, properties, and nested classes.       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 @@ functions, classes, and the `__test__` dictionary, if it exists:       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 @@ If a single object is listed twice (under different names), then tests  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 @@ deprecated isprivate gimmick.       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 @@ object explicitly passed to DocTestFinder:      ...     return base == 'SampleClass'      >>> tests = doctest.DocTestFinder(_namefilter=namefilter).find(SampleClass)      >>> len(tests) -    9 +    11  Turning off Recursion  ~~~~~~~~~~~~~~~~~~~~~ | 
