]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44648: Fix error type in inspect.getsource() in interactive session (GH-27171...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 30 Jul 2021 17:46:42 +0000 (10:46 -0700)
committerGitHub <noreply@github.com>
Fri, 30 Jul 2021 17:46:42 +0000 (19:46 +0200)
(cherry picked from commit 48a62559dfaf775e4f1cc56b19379c799e8e2587)

Co-authored-by: andrei kulakov <andrei.avk@gmail.com>
Lib/inspect.py
Lib/test/test_inspect.py
Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst [new file with mode: 0644]

index 750fd4515339b3326fa1b52820fcbd65b7a6b604..7aedcf1a941b3fbe0ce5f25f6c44e451dde3076c 100644 (file)
@@ -781,6 +781,8 @@ def getfile(object):
             module = sys.modules.get(object.__module__)
             if getattr(module, '__file__', None):
                 return module.__file__
+            if object.__module__ == '__main__':
+                raise OSError('source code not available')
         raise TypeError('{!r} is a built-in class'.format(object))
     if ismethod(object):
         object = object.__func__
index 38d161898fd08acebdd97693faf46b8e2cf15972..b664c14020f35eab42339a519282ff3aed78545f 100644 (file)
@@ -585,6 +585,20 @@ class TestRetrievingSourceCode(GetSourceBase):
     def test_getsource_on_code_object(self):
         self.assertSourceEqual(mod.eggs.__code__, 12, 18)
 
+class TestGetsourceInteractive(unittest.TestCase):
+    def tearDown(self):
+        mod.ParrotDroppings.__module__ = mod
+        sys.modules['__main__'] = self.main
+
+    def test_getclasses_interactive(self):
+        self.main = sys.modules['__main__']
+        class MockModule:
+            __file__ = None
+        sys.modules['__main__'] = MockModule
+        mod.ParrotDroppings.__module__ = '__main__'
+        with self.assertRaisesRegex(OSError, 'source code not available') as e:
+            inspect.getsource(mod.ParrotDroppings)
+
 class TestGettingSourceOfToplevelFrames(GetSourceBase):
     fodderModule = mod
 
@@ -4349,7 +4363,8 @@ def test_main():
         TestBoundArguments, TestSignaturePrivateHelpers,
         TestSignatureDefinitions, TestIsDataDescriptor,
         TestGetClosureVars, TestUnwrap, TestMain, TestReload,
-        TestGetCoroutineState, TestGettingSourceOfToplevelFrames
+        TestGetCoroutineState, TestGettingSourceOfToplevelFrames,
+        TestGetsourceInteractive,
     )
 
 if __name__ == "__main__":
diff --git a/Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst b/Misc/NEWS.d/next/Library/2021-07-15-16-51-32.bpo-44648.2o49TB.rst
new file mode 100644 (file)
index 0000000..f7171c3
--- /dev/null
@@ -0,0 +1,3 @@
+Fixed wrong error being thrown by :func:`inspect.getsource` when examining a
+class in the interactive session. Instead of :exc:`TypeError`, it should be
+:exc:`OSError` with appropriate error message.