diff --git a/Lib/inspect.py b/Lib/inspect.py index 109efc06b26..57c04877c74 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -642,13 +642,13 @@ def cleandoc(doc): def getfile(object): """Work out which source or compiled file an object was defined in.""" if ismodule(object): - if hasattr(object, '__file__'): + if getattr(object, '__file__', None): return object.__file__ raise TypeError('{!r} is a built-in module'.format(object)) if isclass(object): if hasattr(object, '__module__'): object = sys.modules.get(object.__module__) - if hasattr(object, '__file__'): + if getattr(object, '__file__', None): return object.__file__ raise TypeError('{!r} is a built-in class'.format(object)) if ismethod(object): diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 5ad94aba649..f0eb52881bc 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -7,6 +7,8 @@ import doctest import functools import os import sys +import importlib +import unittest # NOTE: There are some additional tests relating to interaction with @@ -435,7 +437,7 @@ We'll simulate a __file__ attr that ends in pyc: >>> tests = finder.find(sample_func) >>> print(tests) # doctest: +ELLIPSIS - [] + [] The exact name depends on how test_doctest was invoked, so allow for leading path components. @@ -681,6 +683,17 @@ Note here that 'bin', 'oct', and 'hex' are functions; 'float.as_integer_ratio', and 'int' is a type. """ + +class TestDocTestFinder(unittest.TestCase): + + def test_empty_namespace_package(self): + pkg_name = 'doctest_empty_pkg' + os.mkdir(pkg_name) + mod = importlib.import_module(pkg_name) + assert doctest.DocTestFinder().find(mod) == [] + os.rmdir(pkg_name) + + def test_DocTestParser(): r""" Unit tests for the `DocTestParser` class. @@ -2945,6 +2958,10 @@ def test_main(): from test import test_doctest support.run_doctest(test_doctest, verbosity=True) + # Run unittests + support.run_unittest(__name__) + + def test_coverage(coverdir): trace = support.import_module('trace') tracer = trace.Trace(ignoredirs=[sys.base_prefix, sys.base_exec_prefix,],