]> granicus.if.org Git - python/commitdiff
Added new parameter exclude_empty to DocTestFinder.__init__, which
authorEdward Loper <edloper@gradient.cis.upenn.edu>
Mon, 13 Sep 2004 05:47:24 +0000 (05:47 +0000)
committerEdward Loper <edloper@gradient.cis.upenn.edu>
Mon, 13 Sep 2004 05:47:24 +0000 (05:47 +0000)
controls whether tests are included for objects with empty docstrings.
Defaults to True, to match the behavior of Python 2.3.

Lib/doctest.py
Lib/test/test_doctest.py

index 2aa740853bbf9873a6f0dc48526b08f593d93251..156ef57ca1deb0e5a2c0665431fa96aee8c4aa9d 100644 (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 @@ 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
index d60738bcbbed165ef857c6a6cea7061046e588d7..a304f5cb27d5a396a06ef3a1c2c0caacb9d0b060 100644 (file)
@@ -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
 ~~~~~~~~~~~~~~~~~~~~~