[Python-checkins] bpo-32991: Restore expectation that inspect.getfile raises TypeError on namespace package (GH-5980)

Jason R. Coombs webhook-mailer at python.org
Mon Mar 5 18:29:11 EST 2018


https://github.com/python/cpython/commit/b9650a04a81355c8a7dcd0464c28febfb4bfc0a9
commit: b9650a04a81355c8a7dcd0464c28febfb4bfc0a9
branch: master
author: Jason R. Coombs <jaraco at jaraco.com>
committer: GitHub <noreply at github.com>
date: 2018-03-05T18:29:08-05:00
summary:

bpo-32991: Restore expectation that inspect.getfile raises TypeError on namespace package (GH-5980)

* bpo-32991: Add test capturing expectation.

DocTestFinder.find should return an empty list for doctests in a namespace package.

* bpo-32991: Restore expectation that inspect.getfile on a namespace package raises TypeError.

files:
M Lib/inspect.py
M Lib/test/test_doctest.py

diff --git a/Lib/inspect.py b/Lib/inspect.py
index 109efc06b268..57c04877c743 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 5ad94aba6492..f0eb52881bcf 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -7,6 +7,8 @@
 import functools
 import os
 import sys
+import importlib
+import unittest
 
 
 # NOTE: There are some additional tests relating to interaction with
@@ -435,7 +437,7 @@ def basics(): r"""
     >>> tests = finder.find(sample_func)
 
     >>> print(tests)  # doctest: +ELLIPSIS
-    [<DocTest sample_func from ...:19 (1 example)>]
+    [<DocTest sample_func from ...:21 (1 example)>]
 
 The exact name depends on how test_doctest was invoked, so allow for
 leading path components.
@@ -681,6 +683,17 @@ def non_Python_modules(): r"""
 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,],



More information about the Python-checkins mailing list