diff options
author | Edward Loper <edloper@gradient.cis.upenn.edu> | 2004-09-13 05:47:24 (GMT) |
---|---|---|
committer | Edward Loper <edloper@gradient.cis.upenn.edu> | 2004-09-13 05:47:24 (GMT) |
commit | 32ddbf7fab000af7941983ecbfe05efd15700255 (patch) | |
tree | eec14f7dd656376fdc92f29c22b6957049a59b19 /Lib | |
parent | c56847878e503ddea8309b0a0c45e06d7c56f2ee (diff) | |
download | cpython-32ddbf7fab000af7941983ecbfe05efd15700255.zip cpython-32ddbf7fab000af7941983ecbfe05efd15700255.tar.gz cpython-32ddbf7fab000af7941983ecbfe05efd15700255.tar.bz2 |
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.
Diffstat (limited to 'Lib')
-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 2aa7408..156ef57 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 d60738b..a304f5c 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 ~~~~~~~~~~~~~~~~~~~~~ |